1 hadoop HA高可用
- 實(shí)現(xiàn)高可用最關(guān)鍵的策略是消除單點(diǎn)故障。HA嚴(yán)格來(lái)說(shuō)應(yīng)該分成各個(gè)組件的HA機(jī)制:HDFS的HA和YARN的HA。
- 前提:配置zookeeper集群
1.1 HDFS HA 高可用
工作機(jī)制
- 元數(shù)據(jù)管理方式需要改變:內(nèi)存中各自保存一份元數(shù)據(jù);Edits日志只有Active狀態(tài)的NameNode節(jié)點(diǎn)可以做寫(xiě)操作;兩個(gè)NameNode都可以讀取Edits;共享的Edits放在一個(gè)共享存儲(chǔ)中管理(journal和NFS兩個(gè)主流實(shí)現(xiàn));
- 需要一個(gè)狀態(tài)管理功能模塊:實(shí)現(xiàn)了一個(gè)zkfailover,常駐在每一個(gè)namenode所在的節(jié)點(diǎn),每一個(gè)zkfailover負(fù)責(zé)監(jiān)控自己所在NameNode節(jié)點(diǎn),利用zk進(jìn)行狀態(tài)標(biāo)識(shí),當(dāng)需要進(jìn)行狀態(tài)切換時(shí),由zkfailover來(lái)負(fù)責(zé)切換,切換時(shí)需要防止brain split現(xiàn)象的發(fā)生。
- 必須保證兩個(gè)NameNode之間能夠ssh無(wú)密碼登錄
- 隔離(Fence),即同一時(shí)刻僅僅有一個(gè)NameNode對(duì)外提供服務(wù)
HDFS HA自動(dòng)故障轉(zhuǎn)移工作機(jī)制
ZKFC是自動(dòng)故障轉(zhuǎn)移中的另一個(gè)新組件,是ZooKeeper的客戶(hù)端,也監(jiān)視和管理NameNode的狀態(tài)。每個(gè)運(yùn)行NameNode的主機(jī)也運(yùn)行了一個(gè)ZKFC進(jìn)程,ZKFC負(fù)責(zé):
- 健康監(jiān)測(cè):ZKFC使用一個(gè)健康檢查命令定期地ping與之在相同主機(jī)的NameNode,只要該NameNode及時(shí)地回復(fù)健康狀態(tài),ZKFC認(rèn)為該節(jié)點(diǎn)是健康的。如果該節(jié)點(diǎn)崩潰,凍結(jié)或進(jìn)入不健康狀態(tài),健康監(jiān)測(cè)器標(biāo)識(shí)該節(jié)點(diǎn)為非健康的。
- ZooKeeper會(huì)話管理:當(dāng)本地NameNode是健康的,ZKFC保持一個(gè)在ZooKeeper中打開(kāi)的會(huì)話。如果本地NameNode處于active狀態(tài),ZKFC也保持一個(gè)特殊的znode鎖,該鎖使用了ZooKeeper對(duì)短暫節(jié)點(diǎn)的支持,如果會(huì)話終止,鎖節(jié)點(diǎn)將自動(dòng)刪除。
- 基于ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發(fā)現(xiàn)沒(méi)有其它的節(jié)點(diǎn)當(dāng)前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經(jīng)贏得了選擇,并負(fù)責(zé)運(yùn)行故障轉(zhuǎn)移進(jìn)程以使它的本地NameNode為Active。故障轉(zhuǎn)移進(jìn)程與前面描述的手動(dòng)故障轉(zhuǎn)移相似,首先如果必要保護(hù)之前的現(xiàn)役NameNode,然后本地NameNode轉(zhuǎn)換為Active狀態(tài)。
配置HDFS HA
hdfs-site.xml
<configuration>
<!-- 完全分布式集群名稱(chēng) -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode節(jié)點(diǎn)都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- 指定NameNode元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<!-- 配置隔離機(jī)制,即同一時(shí)刻只能有一臺(tái)服務(wù)器對(duì)外響應(yīng) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機(jī)制時(shí)需要ssh無(wú)秘鑰登錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/root/.ssh/id_rsa</value>
</property>
<!-- 聲明journalnode服務(wù)器存儲(chǔ)目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/ha/hadoop-3.13/data/jn</value>
</property>
<!-- 關(guān)閉權(quán)限檢查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 訪問(wèn)代理類(lèi):client,mycluster,active配置失敗自動(dòng)切換實(shí)現(xiàn)方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
- 在各個(gè)JournalNode節(jié)點(diǎn)上,輸入以下命令啟動(dòng)journalnode服務(wù)
sbin/hadoop-daemon.sh start journalnode - 在[nn1]上,對(duì)其進(jìn)行格式化,并啟動(dòng)
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode - 在[nn2]上,同步nn1的元數(shù)據(jù)信息
bin/hdfs namenode -bootstrapStandby - 啟動(dòng)[nn2]
sbin/hadoop-daemon.sh start namenode - 在[nn1]上,啟動(dòng)所有datanode
sbin/hadoop-daemons.sh start datanode - 將[nn1]切換為Active
bin/hdfs haadmin -transitionToActive nn1 - 查看是否Active
bin/hdfs haadmin -getServiceState nn1
配置HDFS-HA自動(dòng)故障轉(zhuǎn)移
hdfs-site.xml中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
core-site.xml文件中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
- 關(guān)閉所有HDFS服務(wù):
sbin/stop-dfs.sh - 啟動(dòng)Zookeeper集群:
bin/zkServer.sh start - 初始化HA在Zookeeper中狀態(tài):
bin/hdfs zkfc -formatZK - 啟動(dòng)HDFS服務(wù):
sbin/start-dfs.sh - 在各個(gè)NameNode節(jié)點(diǎn)上啟動(dòng)DFSZK Failover Controller,先在哪臺(tái)機(jī)器啟動(dòng),哪個(gè)機(jī)器的NameNode就是Active NameNode
sbin/hadoop-daemin.sh start zkfc
1.2 YARN HA 高可用
工作機(jī)制
配置YARN-HA集群
yarn-site.xml
<configuration>
<!--啟用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺(tái)resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!--啟用自動(dòng)恢復(fù)-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的狀態(tài)信息存儲(chǔ)在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
在各個(gè)JournalNode節(jié)點(diǎn)上,輸入以下命令啟動(dòng)journalnode服務(wù):
sbin/hadoop-daemon.sh start journalnode在[nn1]上,對(duì)其進(jìn)行格式化,并啟動(dòng):
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode在[nn2]上,同步nn1的元數(shù)據(jù)信息:
bin/hdfs namenode -bootstrapStandby啟動(dòng)[nn2]:
sbin/hadoop-daemon.sh start namenode啟動(dòng)所有DataNode
sbin/hadoop-daemons.sh start datanode將[nn1]切換為Active
bin/hdfs haadmin -transitionToActive nn1在hadoop02中執(zhí)行:
sbin/start-yarn.sh在hadoop03中執(zhí)行:
sbin/yarn-daemon.sh start resourcemanager查看服務(wù)狀態(tài)
bin/yarn rmadmin -getServiceState rm1