Hadoop(25)-高可用叢集配置,HDFS-HA和YARN-HA
一. HA概述
1. 所謂HA(High Available),即高可用(7*24小時不中斷服務)。
2. 實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個元件的HA機制:HDFS的HA和YARN的HA。
3. Hadoop2.0之前,在HDFS叢集中NameNode存在單點故障(SPOF)。
4 . NameNode主要在以下兩個方面影響HDFS叢集
NameNode機器發生意外,如宕機,叢集將無法使用,直到管理員重啟
NameNode機器需要升級,包括軟體、硬體升級,此時叢集也將無法使用
HDFS HA功能通過配置Active/Standby兩個NameNodes實現在叢集中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器
二.HDFS-HA工作機制和工作要點
通過雙NameNode消除單點故障
1. 元資料管理方式需要改變
記憶體中各自儲存一份元資料;
Edits日誌只有Active狀態的NameNode節點可以做寫操作;
兩個NameNode都可以讀取Edits;
共享的Edits放在一個共享儲存中管理(qjournal和NFS兩個主流實現);
2. 需要一個狀態管理功能模組
實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用zk進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。
3. 必須保證兩個NameNode之間能夠ssh無密碼登入
4. 隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
三. HDFS-HA自動故障轉移工作機制
自動故障轉移為HDFS部署增加了兩個新元件:ZooKeeper和ZKFailoverController(ZKFC)程序。ZooKeeper是維護少量協調資料,通知客戶端這些資料的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能:
1. 故障檢測:叢集中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。
2. 現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode。
ZKFC是自動故障轉移中的另一個新元件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個執行NameNode的主機也運行了一個ZKFC程序,ZKFC負責:
1. 健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。
2. ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中開啟的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支援,如果會話終止,鎖節點將自動刪除。
3. 基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責執行故障轉移程序以使它的本地NameNode為Active。故障轉移程序與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換為Active狀態。
單節點相當不可靠,所以用多節點來解決.多節點就會涉及到兩個問題--誰是主誰是從(一個寫多個讀),以及如何確保通訊.
既然每個節點都會宕機,所以寫出去的edits.log就要放到一個第三方上--qjournal,而且qjournal也是一個叢集,對外提供一致性介面.
NameNode之間直接通訊不可靠,所以需要一個ZooKeeper來作為中介,實時監控狀態.狀態為Active的才可以寫,其他的只能讀,以及更頻繁的做原本2NN做的備份的事情
Zkfc的出現,是為了不破壞已有的程式碼健壯性和穩定性
如果不確定Active節點是宕機還是網路問題,千萬不要貿然讓另外的節點上位為Active.如果是之間的網路通訊問題而貿然上位,將會產生非常嚴重的腦裂現象,讓資料全部都不可靠
四. HDFS-HA叢集配置
hadoop100 |
hadoop101 |
hadoop102 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
|
ResourceManager |
|
NodeManager |
NodeManager |
NodeManager |
1. 配置Zookeeper叢集,詳見zookeeper系列文章
2. 配置HA叢集 官方地址:http://hadoop.apache.org/
1). 在/opt/module/目錄下建立一個資料夾
mkdir ha
2). 將/opt/module目錄下的hadoop2.7.2拷貝一份至ha目錄下
cp -r hadoop-2.7.2/ /opt/module/ha/
3). 刪除/opt/module/ha/hadoop2.7.2目錄下的data logs 以及其他沒用的上傳檔案
4).cd etc資料夾下, 重新配置core-site.xml檔案
<configuration> <!-- 把兩個NameNode)的地址組裝成一個叢集mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop執行時產生檔案的儲存目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/ha/hadoop-2.7.2/data/tmp</value> </property> </configuration>
5). 重新配置hdfs-site.xml,如果沒有配置機器間的無密登入,需要先去生成和設定.注意叢集名稱是要對應的,以及每個節點的host名稱,以及路徑,不要搞錯咯~~
<configuration> <!-- 完全分散式叢集名稱 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 叢集中NameNode節點都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop100:9000</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop101:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop100:50070</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop101:50070</value> </property> <!-- 指定NameNode元資料在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value> </property> <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔離機制時需要ssh無祕鑰登入--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/nty/.ssh/id_rsa</value> </property> <!-- 宣告journalnode伺服器儲存目錄--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/module/ha/hadoop-2.7.2/data/jn</value> </property> <!-- 關閉許可權檢查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration>
6). 使用指令碼,同步到hadoop101和hadoop102機器,(指令碼參考這一章Hadoop(4)-Hadoop叢集環境搭建)
xsync /opt/module/ha
五.啟動HDFS-HA叢集
1. 在各個JournalNode節點上,輸入以下命令啟動journalnode服務
sbin/hadoop-daemon.sh start journalnode
2. 在[nn1]上,對其進行格式化,並啟動
bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode
3. 在[nn2]上,同步nn1的元資料資訊
bin/hdfs namenode -bootstrapStandby
4. 啟動[nn2]
sbin/hadoop-daemon.sh start namenode
5. 檢視web頁面顯示
http://hadoop100:50070/dfshealth.html#tab-overview
http://hadoop101:50070/dfshealth.html#tab-overview
兩個節點均為standby狀態
6. 在[nn1]上,啟動所有datanode
sbin/hadoop-daemons.sh start datanode
六. 配置HDFS-HA故障自動轉移
1). 在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>hadoop100:2181,hadoop101:2181,hadoop102:2181</value> </property>
xsync同步配置檔案
2). 啟動
關閉所有HDFS服務:
sbin/stop-dfs.sh
啟動Zookeeper叢集:
bin/zkServer.sh start
初始化HA在Zookeeper中狀態:
bin/hdfs zkfc -formatZK
啟動HDFS服務:
sbin/start-dfs.sh
3). 驗證
將Active NameNode程序kill,觀察另外一個節點是否自動成為Active
kill -9 namenode的程序id
七.YARN-HA配置
1). 官方文件:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
2). yarn-ha工作機制
3).叢集規劃
hadoop100 |
hadoop101 |
hadoop102 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
ResourceManager |
ResourceManager |
|
NodeManager |
NodeManager |
NodeManager |
4). 配置yran-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--啟用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>hadoop100</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop101</value> </property> <!--指定zookeeper叢集的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop100:2181,hadoop101:2181,hadoop102:2181</value> </property> <!--啟用自動恢復--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> <property> <name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
xsync配置檔案到其他機器
5). 啟動
先啟動hdfs-ha
啟動yarn-ha
在hadoop100中執行:
sbin/start-yarn.sh
在hadoop101中執行:
sbin/yarn-daemon.sh start resourcemanager
檢視服務狀態
bin/yarn rmadmin -getServiceState rm1