搭建准备(全分布式到HA模式)
节点规划
拓展:
journalNode与NFS(A机子与B机子相同目录挂载到C机子目录)
HA模式下:有一个问题,你的NN是2台?在某一时刻,谁是Active呢?
client是只能连接Active的,那么怎么配置呢?
core-site.xml
fs.defaultFs -> hdfs://node01:9000
改为下面的配置
hdfs://mycluster
用zk中的前缀(nameservice代替)
配置:
《core-site.xml》
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
《hdfs-site.xml
#以下是 一对多,逻辑到物理节点的映射
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
#以下是JN在哪里启动,数据存那个磁盘,同时也把JN的作用在参数名称上体现了
#(dfs.namenode.shared.edits.dir=>分享nn的edits的dir)
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/bigdata/hadoop/ha/dfs/jn</value>
</property>
#HA角色切换的代理类和实现方法,我们用的ssh免密
#因为ZKFC有三只手,要连zk、自己的nn、对面的nn
#所以必须自己对自己免密,自己跟对面nn的机子免密
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
##Hadoop中ssh免密的作用有如下两点:
1:管理集群间脚本调用
2:HA中zkfc调用本机,调用对面的nn
#开启自动化: 启动zkfc
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
流程:
-
基础设施
- ssh免密:
- 1)启动start-dfs.sh脚本的机器需要将公钥分发给别的节点
- 2)在HA模式下,每一个NN身边会启动ZKFC,
ZKFC会用免密的方式控制自己和其他NN节点的NN状态
- ssh免密:
-
应用搭建
- HA 依赖 ZK 搭建ZK集群
- 修改hadoop的配置文件,并集群同步
-
初始化启动(由HA 架构从里到外)
-
1)先启动JN hadoop-daemon.sh start journalnode
-
2)选择一个NN 做格式化:hdfs namenode -format <只有第一次搭建做,以后不用做>
-
3)启动这个格式化的NN ,以备另外一台同步 hadoop-daemon.sh start namenode
-
4)在另外一台机器中: hdfs namenode -bootstrapStandby
-
5)格式化zk: hdfs zkfc -formatZK <只有第一次搭建做,以后不用做>
-
6)start-dfs.sh
-
-
使用
- 使用验证:
- 1)去看jn的日志和目录变化:
- 2)node04
- zkCli.sh
- ls /
- 启动之后可以看到锁:
- get /hadoop-ha/mycluster/ActiveStandbyElectorLock
- zkCli.sh
- 3)杀死namenode 杀死zkfc
-
kill -9 xxx
-
a)杀死第一台active NN
- 查看zk的hadoop-ha节点下的lock信息
- 锁持有者变成了第二台
- 查看webUI,发现主备变了
- 第一台挂,第二台是主
- 最后再启动第一台hadoop-daemon.sh start namenode
- 发现第一台是备,第二台是主
- 查看zk的hadoop-ha节点下的lock信息
-
b)杀死第二台active NN身边的zkfc
- 查看zk的hadoop-ha节点下的lock信息
- 锁持有者变成了第一台
- 恢复第二台的zkfc hadoop.daemon.sh start zkfc
- 第一台是主,第二台是备
- 查看zk的hadoop-ha节点下的lock信息
-
c)shutdown activeNN 主机的网卡 : ifconfig eth0 down
-
2节点一直阻塞降级(zk中的锁持有者的节点不一定是active,因为另外那个正常nn主机上的ZKFC要去被杀掉网卡的nn主机探查nn状态的,但是网卡被杀连接拒绝,所以另外那个正常nn主机上的ZKFC也就蒙了,一直在报错)
-
如果恢复1上的网卡 ifconfig eth0 up
-
最终 2变成active
-
-