Hadoop-4-全分布式模式安装
1、准备服务器
配置好如下信息:
-
静态IP
/etc/udev/rules.d/70-persistent-net.rules
/etc/sysconfig/network-scripts/ifcfg-eth0
-
主机名称
/etc/sysconfig/network
-
host
/etc/hosts
-
新建用于运行Hadoop的用户
-
Java环境
-
Hadoop环境
2、跨服务器文件传输
【1】复制文件
使用scp
命令,主要有3种情况:
-
向另外一服务器传输文件
scp -r /本地目录 用户名@服务器IP:/目标目录
-
从另外一服务器拉取文件
scp 用户名@服务器IP:/目标文件路径 /本地目录
-
从服务器A向服务器B传输文件
scp -r 用户名@服务器A的IP:/目录 用户名@服务器B的IP:/目录
注意冒号
【2】同步文件
和复制文件不同的是,同步仅仅复制不同的文件,相同的文件则不会复制
使用rsync
命令,主要使用情况和scp
类似
选项 -l 表示保留软连接
同步脚本:
#!/bin/bash
if [ $# -eq 0 ] ; then
echo "请输入同步路径"
exit
fi
arg1=$1
if [ -d $arg1 ] ; then
type=1 #dir
elif [ -f $arg1 ] ; then
type=2 #file
else
echo $arg1"不存在!"
exit
fi
if [ $type -eq 1 ] ; then #目录
abpath=`cd -P $arg1; pwd`
finalpath=$abpath
option="-rvl"
elif [ $type -eq 2 ] ; then #文件
filename=`basename $arg1`
nowpath=`dirname $arg1`
abpath=`cd -P $nowpath; pwd`
finalpath=$abpath"/"$filename
option="-vl"
else
echo "出错了!"
exit
fi
echo "待同步目录的绝对路径:"$finalpath
#待同步的主机IP前缀,注意点
basehost="192.168.20."
for (( host=202; host<=204; host++ )) ; do
ip=$basehost$host
echo "-------- 准备同步"$ip" --------"
rsync $option $finalpath root@$ip:$abpath
done
3、免密登录
-
生成公钥和私钥
使用命令
ssh-keygen -t rsa
,会提示3次,直接按回车即可然后到家目录下的
.ssh
目录中查看生成的2个文件:id_ras
(私钥)和id_rsa.pub
(公钥) -
发送公钥给目标主机
使用命令
ssh-copy-id 用户名@目标主机IP
,第一次发送,需要输入登录密码然后到目标主机的登录用户的家目录下的
.ssh
目录中查看发送过来的公钥文件:authorized_keys
-
验证
使用命令
ssh 用户名@目标主机IP
登录免密主机
4、集群配置
【1】分配节点
因为NameNode、SecondaryNameNode、ResourceManager和JobHistoryServer都很占用资源,所以需要将这4个分开来部署到不同的节点上(也可以不配置JobHistoryServer,只需将节点D以及相应的配置去掉即可)
节点A | 节点B | 节点C | 节点D | |
---|---|---|---|---|
HDFS | NameNode DataNode |
SecondaryNameNode DataNode |
DataNode | DataNode |
YARN | NodeManager | NodeManager | ResourceManager NodeManager |
NodeManager |
MapReduce | JobHistoryServer |
【2】配置节点
-
etc/hadoop/hadoop-env.sh
每一个节点都要配置JAVA_HOME
# The java implementation to use. export JAVA_HOME=${JAVA_HOME}
-
etc/hadoop/core-site.xml
每一个节点都要配置
<!-- 配置NameNode的服务器的IP和端口号,默认端口号为9000 --> <property> <name>fs.defaultFS</name> <value>hdfs://节点A的IP:端口号</value> </property> <!-- 配置临时文件目录 --> <property> <name>hadoop.tmp.dir</name> <value>/指定路径</value> </property>
-
etc/hadoop/hdfs-site.xml
每一个节点都要配置
<!-- 配置副本数 --> <property> <name>dfs.replication</name> <value>4</value> </property> <!-- 配置Secondary NameNode的服务器的IP和端口号,默认端口号为50090 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>节点B的IP:端口号</value> </property>
-
etc/hadoop/yarn-env.sh
每一个节点都要配置JAVA_HOME
# some Java parameters # export JAVA_HOME=/home/y/libexec/jdk1.6.0/
-
etc/hadoop/yarn-site.xml
每一个节点都要配置
<!-- 配置服务器列表 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 配置ResourceManager的主机地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>节点C的IP</value> </property> <!-- 启用日志聚合。默认关闭状态(false) --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志保留时长,单位是秒。默认是-1,表示禁用 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>日志保留时长</value> </property>
-
etc/hadoop/mapred-env.sh
每一个节点都要配置JAVA_HOME
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
-
etc/hadoop/mapred-site.xml
每一个节点都要配置
<!-- 配置执行MapReduce作业时的框架名称 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 配置MapReduce任务历史服务器主机地址:端口,端口号默认为10020 --> <property> <name>mapreduce.jobhistory.address</name> <value>节点D的IP:端口</value> </property> <!-- 配置MapReduce任务历史服务器Web页面主机地址:端口,端口号默认为19888 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>节点D的IP:端口</value> </property>
-
etc/hadoop/slaves
每一个节点都要配置
将每一个节点的主机名称或IP罗列出来,每一个IP占一行,不能有空格或空行
这样就可以一次将命令在多个节点上执行
节点A的IP 节点B的IP 节点C的IP 节点D的IP
需要注意的是,该功能必须为用于运行Hadoop的用户建立ssh信任
需要配置NameNode服务器和ResourceManager服务器到任意一台节点的免密登录,包括它本身
【3】启动集群
-
格式化NameNode
在节点A(NameNode服务器)上执行命令
bin/hdfs namenode -format
-
启动HDFS
在节点A(NameNode服务器)上执行命令
sbin/start-dfs.sh
使用
jps
命令检查是否各个节点上对应的资源已启动 -
启动YARN
在节点C(ResourceManager服务器)上执行命令
sbin/start-yarn.sh
使用
jps
命令检查是否各个节点上对应的资源已启动 -
启动JobHistoryServer
在节点D(JobHistoryServer服务器)上执行命令
sbin/mr-jobhistory-daemon.sh start historyserver
使用
jps
命令检查资源是否已启动
【4】测试集群
-
创建目录
在节点A(NameNode服务器)上执行命令
bin/hadoop fs -mkdir -p /指定目录
-
上传文件
在节点A(NameNode服务器)上执行命令
bin/hadoop fs -put /目标文件路径 /指定目录
-
查看NameNode及DataNode状态
通过管理页面:
http://节点A的IP:50070
,注意需要配置host -
执行MapReduce任务
在节点C(ResourceManager服务器)上执行命令
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar MapReduce程序 /输入目录 /输出目录
-
查看ResourceManager状态
通过管理页面:
http://节点C的IP:8088
,注意需要配置host
【5】关闭集群
-
关闭JobHistoryServer
在节点D(JobHistoryServer服务器)上执行命令
sbin/mr-jobhistory-daemon.sh stop historyserver
使用
jps
命令检查资源是否已关闭 -
关闭YARN
在节点C(ResourceManager服务器)上执行命令
sbin/stop-yarn.sh
使用
jps
命令检查是否各个节点上对应的资源已关闭 -
关闭HDFS
在节点A(NameNode服务器)上执行命令
sbin/stop-dfs.sh
使用
jps
命令检查是否各个节点上对应的资源已关闭
5、注意事项
【1】防火墙问题
如果开启防火墙,则需要注意开启以下几个端口
- HDFS端口,默认为
9000
- NameNode数据传输端口,默认为
50010
- NameNode前端管理页面端口,默认为
50070
(访问)和50075
(下载) - Secondary NameNode数据传输端口,默认为
50090
- ResourceManager数据传输端口,默认为
8032
- ResourceManager前端管理页面端口,默认为
8088
- NodeManager前端管理页面端口,默认为
8042
- MapReduce JobHistoryServer数据传输端口,默认为
10020
- MapReduce JobHistoryServer前端管理页面端口,默认为
19888
#HDFS
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
#NameNode
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50075 -j ACCEPT
#Secondary NameNode
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT
#Resource Manager
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8032 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8088 -j ACCEPT
#NodeManager
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8042 -j ACCEPT
#MapReduce JobHistoryServer
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10020 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 19888 -j ACCEPT
【2】不同节点之间的时间同步问题
可能由于节点间的时间的不同,导致MapReduce job执行的时间不一样,从而导致未知问题。所以需要配置集群时间的同步
-
时间服务器节点检查是否安装ntp,
rpm -qa | grep ntp
-
时间服务器节点修改
/etc/ntp.conf
# Hosts on local network are less restricted. restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap #打开这一行 # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). #server 0.centos.pool.ntp.org iburst #注释这一行 #server 1.centos.pool.ntp.org iburst #注释这一行 #server 2.centos.pool.ntp.org iburst #注释这一行 #server 3.centos.pool.ntp.org iburst #注释这一行 #添加内部时钟服务器 server 127.127.1.0 fudge 127.127.1.0 stratum 10
-
时间服务器节点修改
/etc/sysconfig/ntpd
#硬件时间要同步系统时间 SYNC_HWCLOCK=yes
-
时间服务器节点启动ntpd服务,
service ntpd start
-
时间同步节点配置定时同步任务,
crontab -e
#每半小时同步一次时间 */30 * * * * /usr/sbin/ntpdate 时间服务器IP
【3】未知问题
上传jdk(jdk-8u212)目录时,出现以下异常
19/08/13 03:02:08 WARN hdfs.DataStreamer: Caught exception
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1252)
at java.lang.Thread.join(Thread.java:1326)
at org.apache.hadoop.hdfs.DataStreamer.closeResponder(DataStreamer.java:980)
at org.apache.hadoop.hdfs.DataStreamer.endBlock(DataStreamer.java:630)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:807)
网上搜索,说这是Hadoop的bug!?