Hadoop有三种工作模式:
下面只介绍完全分布式模式的环境配置,至于其他有机会再补上。
安装VMware 与 CentOS的虚拟机
虚拟机网络配置
主机远程登入虚拟机
将hadoop100做为一台模板虚拟机。
安装 epel-release:
[root@hadoop100 ~]# yum install -y epel-release
关闭防火墙,关闭防火墙开机自启:
[root@hadoop100 ~]# systemctl stop firewalld
[root@hadoop100 ~]# systemctl disable firewalld.service
为hao 用户添加 root 权限,方便后期加 sudo 执行 root 权限的命令:
[root@hadoop100 ~]# vim /etc/sudoers
在/opt 目录下创建文件夹,并修改所属主和所属组
[root@hadoop100 ~]# mkdir /opt/module
[root@hadoop100 ~]# mkdir /opt/software
[root@hadoop100 ~]# chown hao:hao /opt/module
[root@hadoop100 ~]# chown hao:hao /opt/software
卸载虚拟机自带的 JDK
[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
将Hadoop102做为配置机。 即:先给配置机Hadoop102装JDK和Hadoop。后面再直接将Hadoop102虚拟机的JDK和Hadoop复制给克隆机Hadoop103、Hadoop104。
将windows主机下的jdk1.8 压缩包通过Xftp拖拽上传到之前在Hadoop102中创建的 /opt/software
文件夹中。
将 jdk 解压到之前创建的 /opt/module/
文件夹中
tar -zxvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
为JDK配置环境变量: /etc/profile.d
文件夹中的.sh
后缀的文件都会被加载到为环境变量。所以:
① 在/etc/profile.d
下创建 my_env.sh
,并编写该文件:
[root@Hadoop102 profile.d]# cd /etc/profile.d
[root@Hadoop102 profile.d]# sudo vim my_env.sh
② 编写my_env.sh
文件,写入:
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
③ 重新加载环境变量的配置文件
source /etc/profile
将windows主机下的Hadoop 3.x压缩包通过Xftp拖拽上传到之前在Hadoop102中创建的 /opt/software
文件夹中。
将Hadoop 3.x解压到之前创建的 /opt/module/
文件夹中
tar -zxvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/
为Hadoop配置环境变量:
① 安装JDK时创建了 my_env.sh
,此时再次打开此文件,并添加:
[root@Hadoop102 profile.d]# cd /etc/profile.d
[root@Hadoop102 profile.d]# vim my_env.sh
② 编写my_env.sh
文件,写入:
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
③ 重新加载环境变量的配置文件
source /etc/profile
# 给hadoop103装JDK、Hadoop
scp -r /opt/module/jdk1.8.0_212/ hao@hadoop103:/opt/module/
scp -r /opt/module/hadoop-3.1.3/ hao@hadoop103:/opt/module/
# 给hadoop104装JDK、Hadoop
scp -r /opt/module/jdk1.8.0_212/ hao@hadoop104:/opt/module/
scp -r /opt/module/hadoop-3.1.3/ hao@hadoop104:/opt/module/
# 也可以在hadoop103上使用scp从hadoop102上拉取,比如:
# scp -r hao@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
Hadoop103、Hadoop104安装JDK、Hadoop是否成功,同上面。
为了后续的方便,设置Hadoop102、Hadoop103、Hadoop104间的免密登入。【免密登陆详情】
scp
命令:复制所有文件。rsync
命令:只复制名称或内容不相同的文件。
所以,使用rsync
指令去编写同步脚本。
编写xsync
文件,内容如下:
#!/bin/bash
# 1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Argument
exit
fi
# 2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ================== $host =====================
# 3. 遍历所有目录,逐个发送
for file in $@
do
# 4. 判断文件是否存在
if [ -e $file ]
then
# 5. 获取父目录
# -P 如果cd后面是一个软链接,-P可以进入软链接指向的真正文件夹
pdir=$(cd -P $(dirname $file); pwd)
# 6. 获取当前文件名称
fname=$(basename $file)
# -p 如果存在则不创建,如果不存在则创建
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
注意:此脚本只能用于文件同步。并不能删除。比如配置机没有data文件,其他克隆机有data文件,使用xsync后,并不能将其他克隆机的data文件删除。
将/home/hao/bin
添加到环境变量:
① 安装JDK时创建了 my_env.sh
,此时再次打开此文件,并添加:
[root@Hadoop102 profile.d]# cd /etc/profile.d
[root@Hadoop102 profile.d]# vim my_env.sh
② 编写my_env.sh
文件,写入:
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
③ 重新加载环境变量的配置文件
source /etc/profile
此时自定义的xsync命令用法:
- 同步当个文件夹或文件:
xsync 当前主机要同步给其他主机的绝对或相对路径
- 同步多个文件夹或文件:
xsync 路径1 路径2
从逻辑上说,环境变量是root才可以修改的,所以要使用root用户去同步
Yarn集群和HDFS集群:逻辑上分离、物理上在一起。
① 逻辑上,Yarn集群的启动和HDFS集群的启动并没有直接的依赖关系。
② 物理上,Yarn集群、HDFS集群,都是在同一个安装了Hadoop的集群内。
MapReduce是计算框架,是代码层面的组件,没有集群之说。
故,Hadoop集群 = HDFS集群 + Yarn集群
。又因为 NameNode
、SecondaryNameNode
、 ResourceManager
都比较占内存,所以最好分别安装在不同的服务器上。最终服务器规划如下:
配置项 | Hadoop102 | Hadoop102 Hadoop103 | Hadoop104 |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceMananger、NodeManager | NodeMananger |
历史服务器 | JobHistoryServer |
默认配置文件: 一般不做修改。位于$HADOOP_HOME/share/hadoop
,即 /opt/module/hadoop-3.1.3/share/hadoop
下
默认的四大配置文件 | 存放位置 |
---|---|
core-default.xml | ① hadoop-common-3.1.3.jar ② 使用jar指令解压后可见core-default.xml文件 |
hdfs-default.xml | ① hadoop-hdfs-3.1.3.jar ② 使用jar指令解压后可见hdfs-default.xml文件 |
yarn-default.xml | ① hadoop-yarn-common-3.1.3.jar ② 使用jar指令解压后可见yarn-default.xml文件 |
mapred-default.xml | ① hadoop-mapreduce-client-core-3.1.3.jar ② 使用jar指令解压后可见mapred-default.xml文件 |
自定义配置文件: 一般修改自定义文件。位于$HADOOP_HOME/etc/hadoop
,即/opt/module/hadoop-3.1.3/etc/hadoop/
下
自定义的四大配置文件 | 存放位置 |
---|---|
core-site.xml | 该目录下直接可见 |
hdfs-site.xml | 该目录下直接可见 |
yarn-site.xml | 该目录下直接可见 |
mapred-site.xml | 该目录下直接可见 |
"1.0" encoding="UTF-8"?>
type="text/xsl" href="configuration.xsl"?>
<!-- 指定NameNode的地址 -->
fs.defaultFS</name>
hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<!-- 我们指定的data文件夹如果不存在,hadoop会自动进行创建 -->
hadoop.tmp.dir</name>
/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hao(即hdfs中的用户) -->
<!-- 如果不配置,那么在浏览器中默认的是Mr.who,该用户删除hdfs文件时,会提示无权限。-->
hadoop.http.staticuser.user</name>
hao</value>
</property>
</configuration>
编写hdfs-site.xml
文件:配置NameData、SecondinaryNameData访问外网信息
"1.0" encoding="UTF-8"?>
type="text/xsl" href="configuration.xsl"?>
<!-- NameNode对外暴露的Web端访问地址 -->
dfs.namenode.http-address</name>
hadoop102:9870</value>
</property>
<!-- 2NN 对外暴露的Web端访问地址(2NN安装在hadoop104上) -->
dfs.namenode.secondary.http-address</name>
hadoop104:9868</value>
</property>
</configuration>
配置yarn-site.xml
文件:
"1.0"?>
<!-- 指定MR走shuffle -->
<!-- 在yarn-default.xml中该项默认值为空,但是官方推荐使用mapreduce_shuffle -->
yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址(ResourceManager安装在hadoop103) -->
yarn.resourcemanager.hostname</name>
hadoop103</value>
</property>
<!-- 环境变量的继承 -->
yarn.nodemanager.env-whitelist</name>
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- 配置日志聚集功能,yarn-default.xml中该项默认为false -->
yarn.log-aggregation-enable</name>
true</value>
</property>
<!-- 设置日志聚集服务器地址,设置聚集到历史日志服务器上,方便查看 -->
yarn.log.server.url</name>
http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间:7天 -->
yarn.log-aggregation.retain-seconds</name>
604800</value>
</property>
<!-- 结点大小限制 -->
yarn.nodemanager.resource.memory-mb</name>
22528</value>
每个节点可用内存,单位MB</discription>
</property>
yarn.scheduler.minimum-allocation-mb</name>
1500</value>
单个任务可申请最少内存,默认1024MB</discription>
</property>
yarn.scheduler.maximum-allocation-mb</name>
16384</value>
单个任务可申请最大内存,默认8192MB</discription>
</property>
</configuration>
配置mapred-site.xml
文件:
"1.0"?>
type="text/xsl" href="configuration.xsl"?>
<!-- 指定MapReduce程序运行在Yarn上 -->
<!-- mapred-default.xml中该项默认值是local,即在本地运行 -->
mapreduce.framework.name</name>
yarn</value>
</property>
<!-- 配置历史服务器的内部服务端地址 -->
mapreduce.jobhistory.address</name>
hadoop102:10020</value>
</property>
<!-- 配置历史服务器暴露的web地址 -->
mapreduce.jobhistory.webapp.address</name>
hadoop102:19888</value>
</property>
<!-- map、reduce结点的限制 -->
mapreduce.map.memory.mb</name>
1500</value>
每个Map任务的物理内存限制</description>
</property>
mapreduce.reduce.memory.mb</name>
3000</value>
每个Reduce任务的物理内存限制</description>
</property>
mapreduce.map.java.opts</name>
-Xmx1200m</value>
</property>
mapreduce.reduce.java.opts</name>
-Xmx2600m</value>
</property>
mapreduce.framework.name</name>
yarn</value>
</property>
</configuration>
参与集群的所有主机都需要记录在$HADOOP_HOME/etc/hadoop/
,即/opt/module/hadoop-3.1.3/etc/hadoop/
路径下的works
文件中。
[root@Hadoop102 ~]# cd /opt/module/hadoop-3.1.3/etc/hadoop/
[root@Hadoop102 hadoop]# vim workers
从逻辑上说,是用户hao安装的Hadoop,所以要使用hao用户去同步Hadoop的文件
[hao@Hadoop102 hadoop]# xsync /opt/module/hadoop-3.1.3/etc/hadoop/
然后,可以在Hadoop103中查看是否同步成功。
如果是第一次启动集群,需要对NameNode进行初始化操作,不是第一次则不用。(类似于电脑新加了一个硬盘,需要给硬盘进行分盘符等初始化操作)
非常重要: 由于配置机以及其他克隆机的Hadoop都是以
hao
用户去创建的,所以为了保证权限的同一,应该hao
用户去执行以下指令,这样该指令所创建的data文件
和logs
文件 还是hao用户。
在配置NameNode的主机上执行以下命令:
# 在任何路径下输入以下初始化命令
[hao@Hadoop102 ~]# hdfs namenode -format
注意:如果多次格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止NameNode和DataNode的进程,并且要使用
rm -rf 文件夹名
删除所有机器的data
和logs
目录,然后再进行格式化
启动:在配置NameNode的主机上执行/opt/module/hadoop-3.1.3/sbin
下的start-dfs.sh
文件。
**查看:**再输入jps
查看当前主机运行的 hdfs 的java进程和集群规划的是否一致。
再上Hadoop103、Hadoop104上查看一下,是否与服务器规划一致,若所有服务器都一致,则hdfs配置成功。
关闭:
hdfs --daemon start/stop namenode/datanode/secondarynamenode
/opt/module/hadoop-3.1.3/sbin
下的stop-dfs.sh
文件。stop-all.sh
文件。启动:在配置ResourceManager的主机上执行/opt/module/hadoop-3.1.3/sbin
下的start-yarn.sh
文件。
**查看:**再输入jps
查看当前主机运行的 hdfs 的java进程和集群规划的是否一致。
再上Hadoop103、Hadoop104上查看一下,是否与服务器规划一致,若所有服务器都一致,则yarn配置成功。
关闭:
hdfs --daemon start/stop resourcemanager/nodemanager
/opt/module/hadoop-3.1.3/sbin
下的stop-yarn.sh
文件。stop-all.sh
文件。在配置JobHistoryServer的主机上的终端输入以下命令:
[hao@Hadoop102 hadoop]$ mapred --daemon start historyserver
如果要关闭历史服务器:
[hao@Hadoop102 hadoop]$ mapred --daemon stop historyserver
http://192.168.10.102:9870
【192.168.10.102是配置机Hadoop102的IP】就可打开如下界面:http://192.168.10.103:8088
【192.168.10.103是克隆机Hadoop103的IP】就可打开如下界面:http://192.168.10.102:19888
【192.168.10.102是克隆机Hadoop102的IP】就可打开如下界面:在hdfs创建文件夹testDir:
查看创建的文件夹testDir:
上传文件a.sh:
# 将 a.sh 文件 上传到 /testDir目录下
[hao@Hadoop102 temp]$ hadoop fs -put /home/hao/temp/a.sh /testDir
注意:上传后,集群中的每台服务器都会存储一份a.sh文件,具体存储在
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-xxxxxxxx/current/finalized/subdir0/subdir0
中。
下载文件a.sh:
删除文件:
# Hadoop中:
# 能 rm -f
# 能 rm -r
# rm -rf 要写成 rm -r -f (r、f要分开)
[hao@Hadoop102 temp]$ hadoop fs -rm -f /testDir/a.sh
# 在任意地方
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /testDir/a.sh /output
然后通过yarn的web管理页面查看,可以发现多出来一个正在运行的wordcount任务。当yarn管理页面上的job状态变为FINISHED
时,代表着程序执行完毕,就可以在/output
目录下查看到输出的结果/output/part-r-00000
。
如果是集群中的主机都能连接外网,那么他们的时间一定是同步的。所以不需要配置时间同步。只有内网有服务器不能连接外网才需要将其与其他主机时间同步。故一般不需要配置
在/home/hao/bin/
下创建hadoop.sh
脚本:
其内容为:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No args Input..."
exit;
fi
case $1 in
"start")
echo "============= 启动hadoop集群 ======================"
echo "------------- 启动 hdfs ---------------------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo "------------- 启动 yarn ---------------------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo "---------- 启动 historyserver ----------------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo "================ 关闭hadoop集群 =========================="
echo "-------------- 关闭historyserver ------------------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo "---------------- 关闭 yarn ------------------------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "---------------- 关闭 hdfs ------------------------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
然后命令为:
hadoop.sh stop
是停止hdfs、yarn、历史服务器hadoop.sh start
是启动hdfs、yarn、历史服务器在/home/hao/bin/
下创建jpsall
脚本:
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo ================= $host =================
ssh $host jps
done
(1) 常用端口号
(2) 配置文件:
HDFS
、Yarn
、历史服务器
。/opt/module/hadoop-3.1.3
下的data
和logs
文件启动集群
步骤