1 hadoop HA高可用
- 實現(xiàn)高可用最關(guān)鍵的策略是消除單點故障。HA嚴格來說應(yīng)該分成各個組件的HA機制:HDFS的HA和YARN的HA钙蒙。
- 前提:配置zookeeper集群
1.1 HDFS HA 高可用
工作機制
- 元數(shù)據(jù)管理方式需要改變:內(nèi)存中各自保存一份元數(shù)據(jù);Edits日志只有Active狀態(tài)的NameNode節(jié)點可以做寫操作间驮;兩個NameNode都可以讀取Edits躬厌;共享的Edits放在一個共享存儲中管理(journal和NFS兩個主流實現(xiàn));
- 需要一個狀態(tài)管理功能模塊:實現(xiàn)了一個zkfailover竞帽,常駐在每一個namenode所在的節(jié)點扛施,每一個zkfailover負責(zé)監(jiān)控自己所在NameNode節(jié)點,利用zk進行狀態(tài)標識屹篓,當(dāng)需要進行狀態(tài)切換時疙渣,由zkfailover來負責(zé)切換,切換時需要防止brain split現(xiàn)象的發(fā)生堆巧。
- 必須保證兩個NameNode之間能夠ssh無密碼登錄
- 隔離(Fence)妄荔,即同一時刻僅僅有一個NameNode對外提供服務(wù)
HDFS HA自動故障轉(zhuǎn)移工作機制
ZKFC是自動故障轉(zhuǎn)移中的另一個新組件,是ZooKeeper的客戶端谍肤,也監(jiān)視和管理NameNode的狀態(tài)啦租。每個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責(zé):
- 健康監(jiān)測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode荒揣,只要該NameNode及時地回復(fù)健康狀態(tài)刷钢,ZKFC認為該節(jié)點是健康的。如果該節(jié)點崩潰乳附,凍結(jié)或進入不健康狀態(tài)内地,健康監(jiān)測器標識該節(jié)點為非健康的。
- ZooKeeper會話管理:當(dāng)本地NameNode是健康的赋除,ZKFC保持一個在ZooKeeper中打開的會話阱缓。如果本地NameNode處于active狀態(tài),ZKFC也保持一個特殊的znode鎖举农,該鎖使用了ZooKeeper對短暫節(jié)點的支持荆针,如果會話終止,鎖節(jié)點將自動刪除颁糟。
- 基于ZooKeeper的選擇:如果本地NameNode是健康的航背,且ZKFC發(fā)現(xiàn)沒有其它的節(jié)點當(dāng)前持有znode鎖,它將為自己獲取該鎖棱貌。如果成功玖媚,則它已經(jīng)贏得了選擇,并負責(zé)運行故障轉(zhuǎn)移進程以使它的本地NameNode為Active婚脱。故障轉(zhuǎn)移進程與前面描述的手動故障轉(zhuǎn)移相似今魔,首先如果必要保護之前的現(xiàn)役NameNode,然后本地NameNode轉(zhuǎn)換為Active狀態(tài)障贸。
配置HDFS HA
hdfs-site.xml
<configuration>
<!-- 完全分布式集群名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode節(jié)點都有哪些 -->
<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>
<!-- 配置隔離機制错森,即同一時刻只能有一臺服務(wù)器對外響應(yīng) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh無秘鑰登錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/root/.ssh/id_rsa</value>
</property>
<!-- 聲明journalnode服務(wù)器存儲目錄-->
<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>
<!-- 訪問代理類:client,mycluster篮洁,active配置失敗自動切換實現(xiàn)方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
- 在各個JournalNode節(jié)點上涩维,輸入以下命令啟動journalnode服務(wù)
sbin/hadoop-daemon.sh start journalnode - 在[nn1]上,對其進行格式化袁波,并啟動
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode - 在[nn2]上瓦阐,同步nn1的元數(shù)據(jù)信息
bin/hdfs namenode -bootstrapStandby - 啟動[nn2]
sbin/hadoop-daemon.sh start namenode - 在[nn1]上,啟動所有datanode
sbin/hadoop-daemons.sh start datanode - 將[nn1]切換為Active
bin/hdfs haadmin -transitionToActive nn1 - 查看是否Active
bin/hdfs haadmin -getServiceState nn1
配置HDFS-HA自動故障轉(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 - 啟動Zookeeper集群:
bin/zkServer.sh start - 初始化HA在Zookeeper中狀態(tài):
bin/hdfs zkfc -formatZK - 啟動HDFS服務(wù):
sbin/start-dfs.sh - 在各個NameNode節(jié)點上啟動DFSZK Failover Controller锋叨,先在哪臺機器啟動垄分,哪個機器的NameNode就是Active NameNode
sbin/hadoop-daemin.sh start zkfc
1.2 YARN HA 高可用
工作機制
yarn ha工作機制
配置YARN-HA集群
yarn-site.xml
<configuration>
<!--啟用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺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>
<!--啟用自動恢復(fù)-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的狀態(tài)信息存儲在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
在各個JournalNode節(jié)點上,輸入以下命令啟動journalnode服務(wù):
sbin/hadoop-daemon.sh start journalnode在[nn1]上娃磺,對其進行格式化薄湿,并啟動:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode在[nn2]上,同步nn1的元數(shù)據(jù)信息:
bin/hdfs namenode -bootstrapStandby啟動[nn2]:
sbin/hadoop-daemon.sh start namenode啟動所有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