Hadoop HA 集群简介:
HDFS集群中NameNode 存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用,直到NameNode 重新启动。
影响HDFS集群不可用主要包括以下两种情况:一是NameNode机器宕机,将导致集群不可用,重启NameNode之后才可使用;二是计划内的NameNode节点软件或硬件升级,导致集群在短时间内不可用。
为了解决上述问题,Hadoop给出了HDFS的高可用HA方案:HDFS通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,比如处理来自客户端的RPC请求,而Standby NameNode则不对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时快速进行切换。
(如果在搭建过程中某个地方出现问题,可参考其他同类文章在那一部分的说明来解决问题。)
集群部署规划:
zhishao准备四个以上节点,本文采用的是centos7系统,如果用Ubuntu系统搭建也可参考,具体centos命令如yum之类注意修改成Ubuntu适用命令。
主机 |
|
系统 |
ip地址 |
软件 |
进程 |
node1 |
|
centos7 |
192.168.206.129 |
jdk8,hadoop |
NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
node2 |
|
centos7 |
192.168.206.130 |
jdk8,hadoop |
NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
node3 |
|
centos7 |
192.168.206.131 |
jdk8,hadoop,zookeeper |
DataNode、NodeManager、JournalNode、QuorumPeerMain |
node4 |
|
centos7 |
192.168.206.132 |
jdk8,hadoop,zookeeper |
DataNode、NodeManager、JournalNode、QuorumPeerMain |
node5 |
|
centos7 |
192.168.206.133 |
jdk8,hadoop,zookeeper |
DataNode、NodeManager、JournalNode、QuorumPeerMain |
(其中 Hadoop版本:2.8.2 ; zookeeper版本:3.4.11)
搭建过程主要包含三个主要阶段:
ssh等基本环境配置、zookeeper集群搭建、hadoop集群搭建
一、ssh等基本环境配置:
1. VMware虚拟机静态ip配置:(根据自身情况决定是否需要配置,此项最后配置亦可。)
修改配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改内容:修改BOOTPROTO=static (改为静态)
若没有则增加IPADDR=192.168.…… (定义ip地址,和网关一致)
在虚拟机的Linux系统设置中,增加一个网卡,默认nat配置即可。
2. 添加hadoop用户:
sudo useradd -m hadoop -s /bin/bash
这条命令创建了可以登陆的 hadoop用户,并使用/bin/bash作为shell。
sudo passwd hadoop
可为 hadoop 用户增加管理员权限,方便部署
sudo adduser hadoop sudo
最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop用户进行登陆。
3. 修改hostname, hosts。
vi /etc/hostname 删除原有内容,自定义主机名保存
修改vi /etc/hosts 添加集群所有节点ip的映射。(头两行不修改)如下图(配置完测试能否ping通)
4. 安装SSH、配置SSH无密码登陆
检查每个虚拟机上是否安装了ssh 和 启动了sshd服务
rpm -qa | grep ssh
如果没有安装请执行下面的代码:
yum -y inst cd .ssh
生成ssh密钥:
ssh localhost 测试,输入yes和密码确认,会自动生成.ssh文件,然后exit退出。
cd .ssh
ssh-keygen -t rsa #遇到提示一路回车就行
#会看到 id_rsa id_rsa.pub两文件前为私钥,后为公钥
cat id_rsa.pub >> authorized_keys #把公钥内容追加到authorized_keys文件中
chmod 600 authorized_keys #修改文件权限,重要不要忽略
至此本机可以无密码登陆自己了,测试 ssh localhost 不再提示输入密码,如果不正确请仔细检查。接下来配置无密码登录其他节点:
scp ~/.ssh/id_rsa.pub hadoop@Slave2:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@Slave3:/home/hadoop/(将密匙发送到其他节点)
登录其他节点操作:
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完就可以删掉了
chmod 600 authorized_keys //注意添加权限
然后测试本机节点是否能ssh 到其他节点。
5. JDK安装:
下载jdk安装包,并解压安装。
设置环境变量,我使用本地环境变量,默认安装的jdk在/usr/lib/java
vi ~/.bashrc
添加环境变量:
export JAVA_HOME=/usr/lib/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
使用:source ~/.bashrc 使之生效。
完成后测试jdk安装是否成功:
java –version
以上几个部分的配置,请细心配置,仔细检查。
二、zookeeper集群搭建
下载zookeeper安装包,解压安装在/usr/local或其他位置。
在zookeeper安装目录的conf目录下新建zoo.cfg文件
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper 在你的主机中建立相应的目录
dataDir=/home/hadoop/zookeeper-3.4.9/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=node3:2888:3888
server.2=node4:2888:3888
server.3=node5:2888:3888
在node3,node4,node5的zookeeper-3.4.9/data下创建一个myid文件,文件内容写一个数字 要和上面配置中的信息一直如 :
server.1=node3:2888:3888 表示要在node3的myid文件中写一个1的数字
server.2=node4:2888:3888 表示要在node4的myid文件中写一个2的数字
server.3=node5:2888:3888 表示要在node5的myid文件中写一个3的数字
最后将该文件发送到其他准备安装zookeeper的节点上。并进行hadoop用户授权:sudo chown –R hadoop ./zookeeper
三、Hadoop安装:
在文末附有配置详解的链接,如有疑问请前往查看。注解 注意要删除掉
hadoop/etc/hadoop/ 目录下配置文件修改:
(注意配置中的路径根据自己情况修改,注释要删掉。)
core-site.xml配置
fs.defaultFS
hdfs://cluster
hadoop.tmp.dir
/usr/local/hadoop-2.8.2/tmp
ha.zookeeper.quorum
node3:2181,node4:2181,node5:2181
其中的cluster命名是在dfs-site.xml中配置的。Tmp.dir一般在hadoop/tmp下,第三个zookeeper的位置,zk默认端口2181,这三个情况都根据自己情况填写。
hdfs-site.xml配置
dfs.nameservices
cluster //集群名称
dfs.ha.namenodes.cluster
node1,node2 //名称节点的名字
dfs.namenode.rpc-address.cluster.node1
node1:9000
dfs.namenode.http-address.cluster.node1
node1:50070
dfs.namenode.rpc-address.cluster.node2
node2:9000
dfs.namenode.http-address.cluster.node2
node2:50070
//journalnode集群信息
dfs.namenode.shared.edits.dir
qjournal://node3:8485;node4:8485;node5:8485/cluster
//journalnode存储位置
dfs.journalnode.edits.dir
/home/hadoop/hadoop-2.7.3/journaldata
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.cluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa //hadoop用户
dfs.ha.fencing.ssh.connect-timeout
30000
在文末附有配置详解的链接,如有疑问请前往查看。注解注意要删除掉
mapred-site.xml配置
mapreduce.framework.name
yarn
yarn-site.xml配置
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
yrc
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
node1
yarn.resourcemanager.hostname.rm2
node2
yarn.resourcemanager.zk-address
node3:2181,node4:2181,node5:2181
yarn.nodemanager.aux-services
mapreduce_shuffle
slaves配置
node3
node4
node5
配置文件修改完毕!
注意:上述配置项请仔细核对、斟酌。
发送hadoop文件至其他节点:
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz node2:/home/hadoop
再在其他节点上解压该压缩包:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/Hadoop
关闭防火墙:
systemctl stop firewalld.service # 关闭firewall
systemctl disable firewalld.service # 禁止firewall开机启动
四、启动步骤
1.先启动zookeeper服务,分别在node3,node4,node5上执行 zkServer.sh start
2.启动journalnode,分别在node3,node4,node5上执行 hadoop-daemon.sh start journalnode 注意只有第一次需要这么启动,之后启动hdfs会包含journalnode
3.格式化HDFS,在node1上执行hdfs namenode -format注意:格式化之后需要把tmp目录拷给node2(如果tmp文件存在的话,不然node2的namenode起不来)
4.格式化ZKFC,在node1上执行hdfs zkfc -formatZK
5.启动HDFS,在node1上执行,start-dfs.sh
6.启动YARN,在node1上执行,start-yarn.sh
7.node2的resourcemanager需要手动单独启动: yarn-daemon.sh start resourcemanager
至此,启动流程结束,对照本文开头的表格看进程是否正常启动。如有问题,仔细ssh是否正常、检查配置文件是否修改正确。
配置文件详解网址:http://blog.csdn.net/ltliyue/article/details/51144381
举例列出了一些安装过程中可能会碰到的问题。
1. yum命令时候报错:Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
解决方法:取消fastestmirror插件的使用。如下:
[hadoop@Slave1 ~]$ sudo vi /etc/yum/pluginconf.d/fastestmirror.conf
[hadoop@Slave1 ~]$ sudo vi /etc/yum.conf
2.ssh配置完记得赋予权限
可通过系统日志查看原因: sudo tail /var/log/secure -n 20(权限问题导致)
解决方法: chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3.ssh 故障
用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。因此我们现在只需要删除knows_hosts文件中所对应的IP节点的公钥,然后再ssh IP地址就可以了 sudo vi ~/.ssh/known_hosts (删除出错记录)。
4.解决 MR程序由于时间同步引起的错误
sudo yum install -y ntp
sudo ntpdate asia.pool.ntp.org #时间同步命令
5.多次格式化后DataNode未启动
通过查看日志诊断是否是clusterID不一致导致的,如果是:查看hdfs-site中关于tmp.dir的地址(一般在/Hadoop/tmp/dfs/name或date/current),去该目录下找到,将VERSION里的ClusterID修改成namenode和datanode一致。
如果datenode未启动则注意是否格式化,每次配置完都需要格式化dfs系统。