文章目錄
- 7. HDFS HA 高可用
- 7.1 HA 概述
- 7.2 HDFS-HA 工作機制
- 7.3 HDFS-HA 手動故障轉移
- 7.3.1 HDFS-HA 工作要點
- 7.3.2 環境準備
- 7.3.3 集羣規劃
- 7.3.4 配置 HDFS-HA 集羣(以三臺爲例)
- 7.3.5 啓動 HDFS-HA 集羣
- 7.3.6 HDFS-HA 集羣手動故障轉移
- 7.4 HDFS-HA 自動故障轉移
- 7.4.1 工作要點
- 7.4.2 ZooKeeper 在 自動故障轉移 中的作用
- 7.4.3 環境準備
- 7.4.4 規劃集羣
- 7.4.5 配置 Zookeeper 集羣
- 7.4.6 配置 HDFS-HA 集羣(以三臺爲例)
- 7.4.7 啓動
- 7.4.9 HDFS-HA 自動故障轉移失敗的原因
- 7.5 YARN-HA 配置
- 7.5 HDFS Federation 架構設計
7. HDFS HA 高可用
7.1 HA 概述
所謂 HA(high available),即高可用(7*24小時不中斷服務)
實現高可用最關鍵的策略是消除單點故障,HA 嚴格來說應該分成各個組件的 HA 機制:HDFS的HA 和 YARN的HA
Hadoop2.0 之前,在 HDFS 集羣中 NameNode 存在單點故障(SPOF)
NameNode 主要在以下兩個方面影響 HDFS 集羣
1. NameNode 機器發生意外,如宕機,集羣將無法使用,直到管理員重啓
2. NameNode 機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用
HDFS HA 功能通過配置 Active/Standby 兩個 NameNodes 實現在集羣中對 NameNode 的熱備來解決上述問題
如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將 NameNode 很快的切換到另外一臺機器
注意:HDFS 配置 HA 後,SecondNamenode 的角色被備用 Namenode 所包含,備用 Namenode 爲活動的 Namenode 命名空間設置週期性的檢查點
7.2 HDFS-HA 工作機制
通過雙 NameNode 消除單點故障
7.3 HDFS-HA 手動故障轉移
7.3.1 HDFS-HA 工作要點
-
元數據管理方式需要改變:
內存中各自保存一份元數據
Edits 日誌只有 Active 狀態的 Namenode 節點可以做寫操作
兩個 Namenode 都可以讀取 edits
共享的 edits 放在一個共享存儲中管理(qjournal 和 NFS 兩個主流實現)
-
需要一個狀態管理功能模塊
實現了一個 zkfailover,常駐在每一個 Namenode 所在的節點,每一個 zkfailover 負責監控自己所在 Namenode 節點,利用 zk 進行狀態標識,當需要進行狀態切換時,由 zkfailover 來負責切換,切換時需要防止 brain split 現象的發生
-
必須保證兩個 NameNode 之間能夠 ssh 無密碼登錄
-
隔離(Fence),即同一時刻僅僅有一個 NameNode 對外提供服務
7.3.2 環境準備
將上面 master、slave1、slave2 三個機器克隆修改相關配置即可,要點如下:
-
修改 IP (可以保持不變)、主機名(改爲 hadoop-1,hadoop-2,hadooop-3)
hadoop-1 192.168.27.101 hadoop-2 192.168.27.102 hadoop-3 192.168.27.103
-
修改主機名及主機名和 IP 地址的映射
-
關閉防火牆
-
ssh 免密登錄
-
清空 Hadoop 的 data 和 logs
7.3.3 集羣規劃
hadoop-1 | hadoop-2 | hadooop-3 |
---|---|---|
NameNode | NameNode | - |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
- | ResourceManager | - |
NodeManager | NodeManager | NodeManager |
7.3.4 配置 HDFS-HA 集羣(以三臺爲例)
-
官方地址:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
-
配置 core-site.xml
<configuration> <!-- 把兩個 NameNode 的地址組裝成一個集羣 mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 聲明 journalnode 服務本地文件系統存儲目錄--> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/tmp/dfs/data/jn</value> </property> <!-- 指定 hadoop 運行時產生文件的存儲目錄(和之前一樣) --> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop/tmp</value> </property> </configuration>
-
配置 hdfs-site.xml
<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>hadoop-1:8020</value> </property> <!-- nn2 的 RPC 通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop-2:8020</value> </property> <!-- nn1 的 http 通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop-1:50070</value> </property> <!-- nn2 的 http 通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop-2:50070</value> </property> <!-- 指定 NameNode 元數據在 JournalNode 上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop-1:8485;hadoop-2:8485;hadoop-3: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>/root/.ssh/id_rsa</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>
-
拷貝配置好的 hadoop 環境到其他節點
7.3.5 啓動 HDFS-HA 集羣
-
在各個 JournalNode 節點上,輸入以下命令啓動 JournalNode 服務
[root@hadoop-1 hadoop]# hadoop-daemon.sh start journalnode starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out [root@hadoop-1 hadoop]# jps 2709 Jps 2648 JournalNode
[root@hadoop-2 hadoop]# hadoop-daemon.sh start journalnode starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out [root@hadoop-2 hadoop]# jps 2578 JournalNode 2639 Jps
[root@hadoop-3 hadoop]# hadoop-daemon.sh start journalnode starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out [root@hadoop-3 hadoop]# jps 2946 JournalNode 3007 Jps
-
在 [nn1] 上,對其進行格式化,並啓動
[root@hadoop-1 hadoop]# hdfs namenode -format [root@hadoop-1 hadoop]# hadoop-daemon.sh start namenode starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
目前 hadoop-1 已啓動,爲 standby 狀態,如下圖
-
在 [nn2] 上,同步 nn1 的元數據信息
[root@hadoop-2 hadoop]# hdfs namenode -bootstrapStandby
可以從日誌看出從 [nn1] 進行同步,如下圖:
-
啓動 [nn2]
[root@hadoop-2 hadoop]# hadoop-daemon.sh start namenode
目前 hadoop-2 已啓動,也爲 standby 狀態,如下圖
-
在 [nn1] 上,啓動所有 Datanode
[root@hadoop-1 .ssh]# hadoop-daemons.sh start datanode
備註:hadoop-daemons 本質是到 slaves 文件中找所有 DataNode
此時所有 Namenode 都是 standby 狀態,不支持讀文件
-
將 [nn1] 切換爲 Active
[root@hadoop-1 .ssh]# hdfs haadmin -transitionToActive nn1
-
查看是否 Active
[root@hadoop-1 .ssh]# hdfs haadmin -getServiceState nn1 active
7.3.6 HDFS-HA 集羣手動故障轉移
-
強殺 Active NameNode [nn1]
[root@hadoop-1 hadoop]# jps 4389 Jps 2648 JournalNode 3112 NameNode 4091 DataNode [root@hadoop-1 hadoop]# kill -9 3112
-
手動 將 [nn2] 切爲 Active
[root@hadoop-1 hadoop]# hdfs haadmin -transitionToActive nn2 20/03/07 16:49:45 INFO ipc.Client: Retrying connect to server: hadoop-1/192.168.27.101:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS) Unexpected error occurred Call From hadoop-1/192.168.27.101 to hadoop-1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused Usage: haadmin [-ns <nameserviceId>] [-transitionToActive [--forceactive] <serviceId>]
發現 Connection refused,因爲爲了防止腦裂,[nn2] 必須和 [nn1] 取得聯繫,但是此時 [nn1] 已掛,所以必須先把 [nn1] 先啓動,再手動將 [nn2] 切爲 Active
-
啓動 [nn1]
[root@hadoop-1 hadoop]# hadoop-daemon.sh start namenode starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out
此時 [nn1] 和 [nn2] 都是 standyby 狀態
-
手動 將 [nn2] 切爲 Active
[root@hadoop-1 hadoop]# hdfs haadmin -transitionToActive nn2
7.4 HDFS-HA 自動故障轉移
7.4.1 工作要點
前面使用命令 hdfs haadmin -failover 手動進行故障轉移,在該模式下,即使現役 NameNode 已經失效,系統也不會自動從現役 NameNode 轉移到待機 NameNode,下面配置部署 HA 自動進行故障轉移
自動故障轉移爲 HDFS 部署增加了兩個新組件:ZooKeeper 和 ZKFailoverController(ZKFC) 進程
ZooKeeper 是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務
7.4.2 ZooKeeper 在 自動故障轉移 中的作用
7.4.2.1 故障檢測
集羣中的每個 NameNode 在 ZooKeeper 中維護了一個持久會話,如果機器崩潰,ZooKeeper 中的會話將終止,ZooKeeper 通知另一個 NameNode 需要觸發故障轉移
7.4.2.2 現役 NameNode 選擇
ZooKeeper 提供了一個簡單的機制用於唯一的選擇一個節點爲 active 狀態
如果目前現役 NameNode 崩潰,另一個節點可能從 ZooKeeper 獲得特殊的排外鎖以表明它應該成爲現役 NameNode
ZKFC 是自動故障轉移中的另一個新組件,是 ZooKeeper 的客戶端,也監視和管理 NameNode 的狀態
每個運行 NameNode 的主機也運行了一個 ZKFC 進程,ZKFC 負責:
-
健康監測
ZKFC 使用一個健康檢查命令定期地 ping 與之在相同主機的 NameNode,只要該 NameNode 及時地回覆健康狀態,ZKFC 認爲該節點是健康的
如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點爲非健康的
-
ZooKeeper 會話管理
當本地 NameNode 是健康的,ZKFC 保持一個在 ZooKeeper 中打開的會話
如果本地 NameNode 處於 active 狀態,ZKFC 也保持一個特殊的 znode 鎖,該鎖使用了 ZooKeeper 對短暫節點的支持,如果會話終止,鎖節點將自動刪除
-
基於 ZooKeeper 的選擇
如果本地 NameNode 是健康的,且 ZKFC 發現沒有其它的節點當前持有 znode 鎖,它將爲自己獲取該鎖
如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地 NameNode 爲 active
故障轉移進程與前面描述的手動故障轉移相似,首先如果必要保護之前的現役 NameNode,然後本地 NameNode 轉換爲 active 狀態
7.4.3 環境準備
將上面 master、slave1、slave2 三個機器克隆修改相關配置即可,要點如下:
-
修改 IP (可以保持不變)、主機名(改爲 hadoop-1,hadoop-2,hadooop-3)
hadoop-1 192.168.27.101 hadoop-2 192.168.27.102 hadoop-3 192.168.27.103
-
修改主機名及主機名和 IP 地址的映射
-
關閉防火牆
-
ssh 免密登錄
-
清空 Hadoop 的 data 和 logs
7.4.4 規劃集羣
hadoop-1 | hadoop-2 | hadoop-3 |
---|---|---|
NameNode | NameNode | - |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
ZK | ZK | ZK |
- | ResourceManager | - |
NodeManager | NodeManager | NodeManager |
7.4.5 配置 Zookeeper 集羣
7.4.5.1 Zookeeper 集羣規劃
在 hadoop-1、hadoop-2 和 hadoop-3 三個節點上部署 Zookeeper
7.4.5.2 解壓安裝
-
解壓 Zookeeper 安裝包到 /usr/zookeeper/ 目錄下
[root@hadoop-1 zookeeper]# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/zookeeper/
-
在 /usr/zookeeper/zookeeper-3.4.14 這個目錄下創建 zkData
[root@hadoop-1 zookeeper-3.4.14]# mkdir -p zkData
-
複製 /usr/zookeeper/zookeeper-3.4.14/conf 這個目錄下的 zoo_sample.cfg 爲 zoo.cfg
[root@hadoop-1 conf]# cp zoo_sample.cfg zoo.cfg
7.4.5.3 配置 zoo.cfg 文件
-
具體配置
dataDir=/usr/zookeeper/zookeeper-3.4.14/zkData
增加如下配置
#######################cluster########################## server.1=hadoop-1:2888:3888 server.2=hadoop-2:2888:3888 server.3=hadoop-3:2888:3888
-
配置參數解讀
Server.A=B:C:D
A 是一個數字,表示這個是第幾號服務器
B 是這個服務器的 ip 地址
C 是這個服務器與集羣中的 Leader 服務器交換信息的端口
D 是萬一集羣中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口
集羣模式下配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面有一個數據就是 A 的值,Zookeeper 啓動時讀取此文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是哪個 server
-
集羣操作
A. 在 /usr/zookeeper/zookeeper-3.4.14/zkData 目錄下創建一個 myid 的文件
touch myid
添加 myid 文件,注意一定要在 linux 裏面創建,在 notepad++ 裏面很可能亂碼
B. 編輯 myid 文件
vim myid
在文件中添加與 server 對應的編號:如 1
C. 拷貝配置好的 zookeeper 到其他機器上
scp -r /usr/zookeeper/zookeeper-3.4.14/ root@hadoop-2:/usr/zookeeper/zookeeper-3.4.14/ scp -r /usr/zookeeper/zookeeper-3.4.14/ root@hadoop-3:/usr/zookeeper/zookeeper-3.4.14/
並分別修改myid文件中內容爲 2、3
D. 分別啓動 zookeeper
[root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh start [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh start [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh start
E. 查看狀態
[root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: follower [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: follower [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/zookeeper/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: leader
hadoop-1、hadoop-2 爲 follower,hadoop-3 爲 leader
7.4.6 配置 HDFS-HA 集羣(以三臺爲例)
-
官方地址:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
-
配置 core-site.xml
在前面手動 HA 配置的基礎上,新增 [core-site.xml] 配置
<property> <name>ha.zookeeper.quorum</name> <value>hadoop-1:2181,hadoop-2:2181,hadoop-3:2181</value> </property>
-
配置 hdfs-site.xml
在前面手動 HA 配置的基礎上,新增 [hdfs-site.xml] 配置
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
-
拷貝配置好的 hadoop 環境到其他節點
7.4.7 啓動
-
關閉所有 HDFS 服務
[root@hadoop-1 hadoop-2.9.2]# stop-dfs.sh
-
啓動 Zookeeper 集羣
[root@hadoop-1 zookeeper-3.4.14]# bin/zkServer.sh start [root@hadoop-2 zookeeper-3.4.14]# bin/zkServer.sh start [root@hadoop-3 zookeeper-3.4.14]# bin/zkServer.sh start
檢查 ZK 啓動狀態,一個 leader,兩個 follower
-
初始化 HA 在 Zookeeper 中狀態
[root@hadoop-1 hadoop-2.9.2]# hdfs zkfc -formatZK
初始化 ZK 的 HA 狀態後,可到 ZK 上確認 hadoop-ha 目錄存在,並且 mycluster 集羣已被 ZK 管理
[root@hadoop-2 hadoop-2.9.2]# cd /usr/zookeeper/zookeeper-3.4.14/ [root@hadoop-2 zookeeper-3.4.14]# bin/zkCli.sh ...... [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper, hadoop-ha] [zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha [mycluster]
-
啓動 HDFS 服務:
[root@hadoop-1 hadoop-2.9.2]# start-dfs.sh Starting namenodes on [hadoop-1 hadoop-2] hadoop-1: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out hadoop-2: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-2.out hadoop-1: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-1.out hadoop-3: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-3.out hadoop-2: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-2.out Starting journal nodes [hadoop-1 hadoop-2 hadoop-3] hadoop-1: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out hadoop-2: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out hadoop-3: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out Starting ZK Failover Controllers on NN hosts [hadoop-1 hadoop-2] hadoop-1: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-1.out hadoop-2: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-2.out
啓動 HDFS 服務,觀察啓動日誌,發現主要啓動了:
(1) namenodes : [hadoop-1 hadoop-2]
(2) journal nodes : [hadoop-1 hadoop-2 hadoop-3]
(3) ZK Failover Controllers : [hadoop-1 hadoop-2] (ZKFC 跟着 NN 走)
在各個節點上 jps 觀察所有組件啓動成功,在 web 界面觀察兩個 Namenode 的狀態
NameNode 先啓動的就是 Active 狀態
7.4.8 驗證
-
將 Active NameNode 進程 kill
[root@hadoop-1 hadoop-2.9.2]# jps 5028 DataNode 2581 QuorumPeerMain 5607 Jps 5256 JournalNode 5465 DFSZKFailoverController 4910 NameNode [root@hadoop-1 hadoop-2.9.2]# kill -9 4910
但是遺憾發現,Namenode1 被 kill 之後,Namenode2 並沒有啓動,解決方式見: 7.4.9 HDFS-HA 自動故障轉移失敗的原因
,到 Namenode2 節點上看 hadoop-root-zkfc-hadoop-2.log 日誌
-
將 Active NameNode 機器斷開網絡
service network stop
觀察上述兩個場景下的 HDFS-HA 自動故障轉移
7.4.9 HDFS-HA 自動故障轉移失敗的原因
如果發現 HA 配置沒有問題,但是不能自動切換 active 的 Namenode,我們可以查看 zkfc 的 log 日誌,看是否會出現下面的 Warn 或者 Exception:
hadoop-2 ssh 到 hadoop-1 上,嘗試連接到 8020 這個 rpc 端口,但是因爲 hadoop-1 上的 Namenode 進程被關了,自然連不上
hadoop-2 使用了 fuser 工具,但是裝的 Centos 是最小化安裝,並不包含 fuser,所以需要在所有 Namenode 機器(hadoop-1,hadoop-2)上安裝 fuser
[root@hadoop-1 logs]# yum install psmisc
[root@hadoop-2 logs]# yum install psmisc
7.5 YARN-HA 配置
7.5.1 YARN-HA 工作機制
- 官方文檔
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
- YARN-HA 工作機制
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0GuSX3dm-1583649732230)(https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/images/rm-ha-overview.png)]
7.5.2 配置 YARN-HA 集羣
7.5.2.1 環境準備
在前面 Hdfs HA 的基礎上進行配置
7.5.2.2 規劃集羣
和前面 Hdfs HA 的集羣的基礎上規劃:hadoop-1 和 hadoop-2 上配置 active/standby ResourceManager
hadoop-1 | hadoop-2 | hadoop-3 |
---|---|---|
NameNode | NameNode | - |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
ZK | ZK | ZK |
ResourceManager | ResourceManager | - |
NodeManager | NodeManager | NodeManager |
7.5.2.3 配置 yarn-site.xml
[yarn-site.xml]
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- reducer 獲取數據的方式 -->
<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-yarn</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop-1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-2</value>
</property>
<!--指定zookeeper集羣的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-1:2181,hadoop-2:2181,hadoop-3: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>
<!-- 忽略虛擬內存檢查,如果實在實體機上,並且內存夠多,可以去掉 -->
<property>
<name>yarn.nodemanager.vmen-check-enabled</name>
<value>false</value>
</property>
</configuration>
同步更新其他節點的配置信息
7.4.2.4 啓動 Hdfs
前置狀態:ZK 集羣已起,Hadoop 未起
-
啓動 Hdfs
[root@hadoop-1 hadoop]# start-dfs.sh Starting namenodes on [hadoop-1 hadoop-2] hadoop-1: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-1.out hadoop-2: starting namenode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-namenode-hadoop-2.out hadoop-1: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-1.out hadoop-3: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-3.out hadoop-2: starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-hadoop-2.out Starting journal nodes [hadoop-1 hadoop-2 hadoop-3] hadoop-1: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-1.out hadoop-3: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-3.out hadoop-2: starting journalnode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-journalnode-hadoop-2.out Starting ZK Failover Controllers on NN hosts [hadoop-1 hadoop-2] hadoop-1: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-1.out hadoop-2: starting zkfc, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-zkfc-hadoop-2.out
注意,此處 namenodes 在 [hadoop-1 hadoop-2] 都起來了!
-
啓動 Yarn
因爲配置了 ResourceManager 在 hadoop-1、hadoop-2 上,所以在 hadoop-2 上啓動效果一樣
[root@hadoop-2 hadoop]# yarn-daemon.sh start resourcemanager starting resourcemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-resourcemanager-hadoop-2.out [root@hadoop-2 hadoop]# jps 24064 DataNode 24432 ResourceManager 24688 Jps 4995 QuorumPeerMain 23978 NameNode 24314 DFSZKFailoverController 24174 JournalNode
確認 ResourceManager 在 hadoop-2 上啓動成功,可再次在 web 端確認:
但是和 Hdfs HA 不一樣,此時 hadoop-1 上並不會啓動 ResourceManager,需要我們再次啓動
[root@hadoop-1 hadoop]# yarn-daemon.sh start resourcemanager starting resourcemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-resourcemanager-hadoop-1.out
-
查看服務狀態
[root@hadoop-3 hadoop]# yarn rmadmin -getServiceState rm1 standby [root@hadoop-3 logs]# yarn rmadmin -getServiceState rm2 active
可見 rm2 是 active 狀態
7.5 HDFS Federation 架構設計
7.5.1 NameNode 架構的侷限性
-
Namespace(命名空間)的限制
由於 NameNode 在內存中存儲所有的元數據(metadata),因此單個 Namenode 所能存儲的對象(文件+塊)數目受到 Namenode 所在 JVM 的 heap size 的限制
50G 的 heap 能夠存儲 20億(200million)個對象,這 20 億個對象支持 4000 個 Datanode,12PB 的存儲(假設文件平均大小爲 40MB)
隨着數據的飛速增長,存儲的需求也隨之增長
單個 Datanode 從 4T 增長到 36T,集羣的尺寸增長到 8000 個 Datanode,存儲的需求從 12PB 增長到大於100PB
-
隔離問題
由於 HDFS 僅有一個 Namenode,無法隔離各個程序,因此 HDFS 上的一個實驗程序就很有可能影響整個 HDFS 上運行的程序
-
性能的瓶頸
由於是單個 Namenode 的 HDFS 架構,因此整個 HDFS 文件系統的吞吐量受限於單個 Namenode 的吞吐量
7.5.2 HDFS Federation 架構設計
能不能有多個NameNode
NameNode | NameNode | NameNode |
---|---|---|
元數據 | 元數據 | 元數據 |
Log | machine | 電商數據/話單數據 |
7.5.3 HDFS Federation 應用思考
不同應用可以使用不同 NameNode 進行數據管理
圖片業務、爬蟲業務、日誌審計業務
Hadoop 生態系統中,不同的框架使用不同的 NameNode 進行管理 Namespace(隔離性)