根据我们之前搭建的hadoop集群,都只有一个namenode,一个resourcemanager。一旦namenode挂了,整个hdfs就废了,因为namenode负责着元数据信息的管理,响应客户端。
如果是resourcemanager挂了,那么yarn也是废了,无法尽心资源调度,没办法跑mapreduce,spark等运算框架。
这种情况下就急需一个高可用的hadoop集群
hadoop2.0中提供了一些特性如,HDFS HA、YARN等。在hadoop-2.6.4中加入了YARN HA
hadoop-HA集群运作机制介绍
所谓HA,即高可用(7*24小时不中断服务)
实现高可用最关键的是消除单点故障
hadoop-ha严格来说应该分成各个组件的HA机制–HDFS的HA、YARN的HA
HDFS的HA机制详解
通过双namenode消除单点故障
双namenode协调工作的要点:
A、元数据管理方式需要改变:
内存中各自保留一份元数据
Edits日志只能有一份,只有active状态的namenode节点可以做写操作
两个namenode都可以读取edits
共享的edits放在一个共享存储中管理(qjoutnal和NFS两个主流实现)
B、需要一个状态管理功能模块
实现一个zkfailover,常驻在每一个namenode所在的节点
每一个zkfailover负责监控自己所在namenode节点,利用zookeeper进行状态标识
当需要进行状态切换时,由zkfailover来负责切换
切换时需要防止brain split现象的发生
这里的brain split也就是脑裂,在一些有状态的HA系统中,本来一个独立的节点,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏,这种情况称之为脑裂。防止脑裂有两种方式:1.ssh发送kill指令 2、调用用户自定义脚本程序
本次搭建使用三台虚拟机server1,server2,server3
担任角色:
server1:NameNode、DFSZKFailoverController(zkfc)、ResourceManager、QuorumPeerMain、QuorumPeerMain、QuorumPeerMain
server1:NameNode、DFSZKFailoverController(zkfc)、ResourceManager
server2:DataNode、NodeManager
在/etc/hosts中配好地址和主机名映射关系
192.168.123.20 server1
192.168.123.21 server2
192.168.123.22 server3
在hadoop-ha中我们需要zookeeper来帮我们标识节点状态,动态选举节点
由于安装zookeeper不是本节重点,因此这里只提到安装zookeeper需要注意的一些细节(如果还有不懂的请留言,下次专门出一篇安装zookeeper的文章)
并且zookeeper是用于分布式协调服务,因此,推荐启动奇数台zookeeper。我们这里启动三个。
cd /usr/local/apps/zookeeper/conf
具体位置看你解压到哪个位置。
根据上面的规划,我们是要在server1上启动三个zookeeper的伪分布式集群。
因此我们需要三个不同的配置文件
cp zoo_sample.cfg zk1.cfg
cp zoo_sample.cfg zk2.cfg
cp zoo_sample.cfg zk3.cfg
#指定数据文件夹和日志文件夹
dataDir=/usr/local/apps/zookeeper/data/zk1
dataLogDir=/usr/local/apps/zookeeper/log/zk1
#指定端口
clientPort=2181
#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888
dataDir=/usr/local/apps/zookeeper/data/zk2
dataLogDir=/usr/local/apps/zookeeper/log/zk2
clientPort=2182
#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888
dataDir=/usr/local/apps/zookeeper/data/zk3
dataLogDir=/usr/local/apps/zookeeper/log/zk3
clientPort=2183
#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888
echo "1" > /usr/local/apps/zookeeper/data/zk1/myid
echo "2" > /usr/local/apps/zookeeper/data/zk2/myid
echo "3" > /usr/local/apps/zookeeper/data/zk3/myid
zkServer.sh start zk1.cfg
zkServer.sh start zk2.cfg
zkServer.sh start zk3.cfg
搭建hadoop-ha并不难,主要就是配置一大堆配置文件。下面看看要如何配置
fs.defaultFS
hdfs://kris/
hadoop.tmp.dir
/home/hadoop/hadata/tmp
hadoop.namenode.dir
/home/hadoop/hadata/name
hadoop.data.dir
/home/hadoop/hadata/data
ha.zookeeper.quorum
server1:2181,server1:2182,server1:2183
dfs.replication
1
dfs.nameservices
kris
dfs.ha.namenodes.kris
nn1,nn2
dfs.namenode.rpc-address.kris.nn1
server1:9000
dfs.namenode.http-address.kris.nn1
server1:50070
dfs.namenode.rpc-address.kris.nn2
server2:9000
dfs.namenode.http-address.kris.nn2
server2:50070
dfs.namenode.shared.edits.dir
qjournal://server1:8485;server2:8485/kris
dfs.namenode.edits.dir
/home/hadoop/journalnode
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.kris
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
dfs.ha.fencing.ssh.connect-timeout
30000
mapreduce.framework.name
yarn
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
iamkris
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
server1
yarn.resourcemanager.hostname.rm2
server2
yarn.resourcemanager.zk-address
server1:2181,server1:2182,server1:2183
yarn.nodemanager.aux-services
mapreduce_shuffle
以上配置就基本完成了。接下来配置server1到server2,server3的免密登录。以及server2到server1、server3的免密登录
server1,2之间的免密登录是因为ssh fence需要到对方机器上执行脚本。它们到server3的免密登录是因为当我们用start-dfs.sh时,是通过ssh到机器上启动datanode的
#生成公钥和私钥
ssh-keygen
#拷贝公钥到其他机器
ssh-copy-id server1
zookeeper刚刚我们已经启动了,现在分别在server1和server2上启动qjournalnode。
hadoop-daemon.sh start journalnode
#运行jps命令校验,server1,server2上是否有多了journalnode进程
在server1上执行命令
hdfs namenode -format
#格式化后会根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hadoop/hadata/tmp,然后将/home/hadoop/hadata/tmp
拷贝到server2的/home/hadoop/hadata/tmp下。journalnode文件夹也需要拷贝
#也可以这样hdfs namenode -bootstrapStandby
hdfs zkfc -formatZK
start-dfs.sh
执行此命令,记得在slaves文件中配置server3。表示在server3上启动子节点
start-yarn.sh
到此,hadoop-2.6.4配置完毕,可以用浏览器访问:
#active
http://server1:50070
#standby
http://server2:50070