參考鏈接
0. 說明
在 Hadoop 完全分布式安裝 & ZooKeeper 集群的安裝部署的基礎之上進行 Hadoop 高可用(HA)的自動容災配置
Hadoop 高可用
High Availablility 相當於再配置一台 NameNode
單節點模式容易產生單點故障
冷備份和熱備份的區別
熱備份:有兩個 NameNode 同時工作,其中一台機器處於 active 狀態,另一台機器處於 standby 狀態。
兩個節點數據是即時同步的,起同步作用的進程成為 JournalNode
冷備份:相當於 SecondaryNameNode
1. NameNode & DataNode 多目錄配置
0. 關閉集群
stop-all.sh
1. NameNode 多目錄配置
目的:用於冗余,存儲多個鏡像文件副本
# 編輯 hdfs-site.xml sudo vim /soft/hadoop/etc/hadoop/hdfs-site.xml <property> <name>dfs.namenode.name.dir</name> <value>/home/centos/hadoop/dfs/name1,/home/centos/hadoop/dfs/name2</value> </property>
分發配置文件
xsync.sh /soft/hadoop/etc/hadoop/hdfs-site.xml
重命名 name 文件夾為 name1 ( 在 /home/centos/hadoop/dfs 目錄執行以下操作 )
mv name name1
拷貝 name1 文件夾到 name2
cp -r name1 name2
2. DataNode 多目錄配置
目的:用於擴容,將所有數據文件存放在不同的磁盤設備上,如 SSD 等等
# 編輯 hdfs-site.xml
sudo vim /soft/hadoop/etc/hadoop/hdfs-site.xml
<property> <name>dfs.datanode.data.dir</name> <value>/home/centos/hadoop/dfs/data1,/home/centos/hadoop/dfs/data2</value> </property>
分發配置文件
xsync.sh /soft/hadoop/etc/hadoop/hdfs-site.xml
重命名 data 文件夾為 data1
xcall.sh mv /home/centos/hadoop/dfs/data /home/centos/hadoop/dfs/data1
啟動 HDFS
start-dfs.sh
3. 配置高可用(冷備份)
3.0 拷貝 full 文件夾到 ha
# 復制 Hadoop 配置文件 cp -r /soft/hadoop/etc/full /soft/hadoop/etc/ha # 更改軟鏈接 ln -sfT /soft/hadoop/etc/ha /soft/hadoop/etc/hadoop
3.1 修改 hdfs-site.xml
<?xml version="1.0"?> <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>s105:50090</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/centos/ha/dfs/name1,/home/centos/ha/dfs/name2</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/centos/ha/dfs/data1,/home/centos/ha/dfs/data2</value> </property> <!-- hdfs高可用配置 --> <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>s101:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>s105:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>s101:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>s105:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://s102:8485;s103:8485;s104:8485/mycluster</value> </property> <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>shell(/bin/true)</value> </property> </configuration>
3.2 修改 core-site.xml
<?xml version="1.0"?> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/centos/ha/dfs/journal/node/local/data</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/centos/ha</value> </property> </configuration>
3.3 修改 slaves 文件
s102
s103
s104
3.4 配置 s105 的 SSH 免密登陸
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id centos@s101
ssh-copy-id centos@s102
ssh-copy-id centos@s103
ssh-copy-id centos@s104
ssh-copy-id centos@s105
3.5 將 s101 的工作目錄發送給 s105
刪除 s102-s105 的配置文件,不要用 xcall.sh 腳本
ssh s102 rm -rf /soft/hadoop/etc ssh s103 rm -rf /soft/hadoop/etc ssh s104 rm -rf /soft/hadoop/etc ssh s105 rm -rf /soft/hadoop/etc
將 s101 配置文件分發
xsync.sh /soft/hadoop/etc
3.6 啟動 JournalNode
hadoop-daemons.sh start journalnode
3.7 格式化 NameNode
hdfs namenode -format
3.8 將 s101 的 ha 目錄發送給 s105
scp -r ~/ha centos@s105:~
3.9 啟動 HDFS ,觀察 s101 和 s105 的 NameNode 情況
start-dfs.sh
3.10 手動切換 s101 的 NameNode 為 active 狀態
hdfs haadmin -transitionToActive nn1
4. 配置高可用(熱備份)
4.0 說明
Hadoop 高可用熱備份的配置建立在冷備份的配置基礎之上
4.1 關閉 Hadoop
stop-all.sh
4.2 啟動 s102-s104 的 ZooKeeper
zkServer.sh start
4.3 修改 hdfs-site.xml ,添加以下內容
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
4.4 修改 core-site.xml ,添加以下內容
<property> <name>ha.zookeeper.quorum</name> <value>s102:2181,s103:2181,s104:2181</value> </property>
4.5 分發配置文件
xsync.sh /soft/hadoop/etc/hadoop/hdfs-site.xml
xsync.sh /soft/hadoop/etc/hadoop/core-site.xml
4.6 初始化 ZooKeeper
hdfs zkfc -formatZK
4.7 啟動 HDFS
start-dfs.sh
4.8 查看進程
xcall.sh jps
4.9 啟動 Zookeeper 命令行腳本 zkCli.sh
zkCli.sh
5. 測試 Hadoop 高可用(HA)的自動容災
5.0 說明
通過關閉 s101 的 NameNode 進程驗證 Hadoop 高可用的自動容災
5.1 通過 Web 查看 Hadoop 兩個節點 s101 、s105 的狀態
http://192.168.23.101:50070
http://192.168.23.105:50070
5.2 關閉 s101
已知 s101 的 NameNode 進程 id 為 3478
kill -9 3478
5.3 再次查看 Hadoop 兩個節點 s101 、s105 的狀態
通過 Web 可以看出 s105 的狀態為 active ,實現了自動容災
6. 查看 Hadoop 高可用文件
在 s102 啟動 ZooKeeper 命令行( zkCli.sh ),再執行以下操作
其中:
- ActiveStandbyElectorLock 是臨時結點,負責存儲 active 狀態下的節點地址
- ActiveBreadCrumb 是永久結點,負責在 ZooKeeper 會話關閉時,下一次啟動狀態下正確分配 active 節點,避免腦裂(brain-split),即兩個 active 節點狀態
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper, hadoop-ha] [zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha [mycluster] [zk: localhost:2181(CONNECTED) 2] ls /hadoop-ha/mycluster [ActiveBreadCrumb, ActiveStandbyElectorLock] [zk: localhost:2181(CONNECTED) 3] get /hadoop-ha/mycluster/ActiveBreadCrumb myclusternn1s101 �>(�> cZxid = 0x500000008 ctime = Thu Sep 27 10:16:23 CST 2018 mZxid = 0x500000016 mtime = Thu Sep 27 11:13:05 CST 2018 pZxid = 0x500000008 cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 28 numChildren = 0 [zk: localhost:2181(CONNECTED) 4] get /hadoop-ha/mycluster/ActiveStandbyElectorLock myclusternn1s101 �>(�> cZxid = 0x500000015 ctime = Thu Sep 27 11:13:05 CST 2018 mZxid = 0x500000015 mtime = Thu Sep 27 11:13:05 CST 2018 pZxid = 0x500000015 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x666618cd7c5a0005 dataLength = 28 numChildren = 0