Hadoop的配置文件設置(HDFS HA)
參考:http://hadoop.apache.org/docs/r2.7.4/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
各虛擬節點配置
YARN |
HDFS |
|||||||
hostname |
IP |
ResourceManager |
NodeManager |
NameNode |
DataNode |
Zookeeper |
JournalNode |
Process |
master |
192.168.2.1 |
Y |
|
Y |
|
Y |
Y |
NameNode |
slave1 |
192.168.2.2 |
Y |
Y |
Y |
Y |
Y |
Y |
NameNode |
slave2 |
192.168.2.3 |
|
Y |
|
Y |
Y |
Y |
JournalNode |
1:原理
hadoop 2.x 中支持NFS及QJM (Quorum Journal Manager), QJM 是由Cloudera 提出的基於Paxos的方案
Hadoop提供了ZKFailoverController角色,部署在每個NameNode的節點上,作為一個deamon進程, 簡稱zkfc,示例圖如下
ZKFailoverController 主要包括三個組件:
- HealthMonitor: 監控NameNode是否處於unavailable或unhealthy狀態,當前通過RPC調用NN相應的方法完成
- ActiveStandbyElector: 管理和監控自己在ZK中的狀態
- ZKFailoverController 它訂閱HealthMonitor 和ActiveStandbyElector 的事件,並管理NameNode的狀態
ZKFailoverController主要職責:
- 健康監測:周期性的向它監控的NN發送健康探測命令,從而來確定某個NameNode是否處於健康狀態,如果機器宕機,心跳失敗,那麽zkfc就會標記它處於一個不健康的狀態
- 會話管理:如果NN是健康的,zkfc就會在zookeeper中保持一個打開的會話,如果NameNode同時還是Active狀態的,那麽zkfc還會在Zookeeper中占有一個類型為短暫類型的znode,當這個NN掛掉時,這個znode將會被刪除,然後備用的NN,將會得到這把鎖,升級為主NN,同時標記狀態為Active
- 當宕機的NN新啟動時,它會再次註冊zookeper,發現已經有znode鎖了,便會自動變為Standby狀態,如此往復循環,保證高可靠,需要註意,目前僅僅支持最多配置2個NN
- master選舉:如上所述,通過在zookeeper中維持一個短暫類型的znode,來實現搶占式的鎖機制,從而判斷那個NameNode為Active狀態
2:配置
Hadoop HA的配置包括2部分,HDFS HA用於NameNode及YARN HA用於ResourceManager, 本節先配置hdfs ha
創建journal臨時目錄:/home/mytestzk/Hadoop-2.7.4/tmp/journal
- 修改core-site.xml,增加節點ha.zookeeper.quorum
- 修改hdfs-site.xml
刪除節點dfs.namenode.secondary.http-address,並增加以下配置節點(紅框內):
3:首次啟動:
- 3.1 首先啟動zookeeper集群, 分別在master, slave1, slave2執行以下命令
./bin/zkServer.sh start
- 3.2 初始化HA空間,在master namenode節點執行命令,格式化zkfc,在zookeeper中生成znode節點,用來保存HA或failover的數據
./bin/hdfs zkfc -formatZK
- 3.3 啟動journalnode集群, 在每個節點用如下命令啟日誌程序
NameNode將元數據操作日誌記錄在JournalNode上,主備NameNode通過記錄在JouralNode上的日誌完成元數據同步
./sbin/hadoop-daemon.sh start journalnode
- 3.4 格式化主namenode節點
./bin/hdfs namenode -format mycluster
- 3.5 初始化JournalNode (直接配置HA時不需要這步)
如果是非HA轉HA才需要這一步,在其中一個JournalNode上執行以下命令,用namenode的edits初始化JournalNode:
bin/hdfs namenode -initializeSharedEdits
- 3.6 啟動NameNode
在主namenode節點,執行命令啟動namenode:./sbin/hadoop-daemon.sh start namenode
在備namenode節點,首先執行命令:./bin/hdfs namenode -bootstrapStandby
這個是把備namenode節點的目錄格式化並把元數據從主namenode節點copy過來,並且這個命令不會把journalnode目錄再格式化了
然後再執行命令啟動備namenode進程:./sbin/hadoop-daemon.sh start namenode
- 3.7 啟動ZKFC,在兩個namenode節點都執行以下命令
./sbin/hadoop-daemon.sh start zkfc
- 3.8 啟動datanode, 在所有datanode節點都執行以下命令
./sbin/hadoop-daemon.sh start datanode
4:正常啟動結束方法:
啟動:
下次啟動的時候,先啟動zookeeper,然後執行以下命令就可以全部啟動所有進程和服務了:
./sbin/start-dfs.sh
結束:
停止所有HDFS相關的進程服務,執行以下命令:
./sbin/stop-dfs.sh
5:測試HA的高可用性
在active namenode上執行如下命令關閉namenode: sbin/hadoop-daemon.sh stop namenode
然後訪問以下兩個地址查看namenode的狀態:
http://master:50070/dfshealth.html
http://slave1:50070/dfshealth.html
從HDFS Non-HA 升級到 HDFS HA
- 停止HDFS:./sbin/stop-dfs.sh
- 修改配置文件 core-site.xml, hdfs-site.xml並覆蓋到每臺機器上
- 啟動zookeeper
- 啟動journalnode集群,上述第3.3步驟
- 初始化JournalNode,上述第3.5步驟
- 啟動namenode節點,上述第3.6步驟
- 啟動datanode節點,上述第3.8步驟
上面步驟只是配置了手動failover,在這種模式下,系統不會自動觸發failover,即不會將Standby提升為Active,即使Active已經失效。接下來介紹如何實現自動failover。
- 初始化HA空間,上述第3.2步驟
完成上訴步驟後,就可以正常啟動hdfs了,此時hdfs已經具備自動failover功能。
ZKFC和Namenodes守護進程的啟動順序沒有關系,ZKFC只是調度Namenode的存活狀態,如果不啟動ZKFC,此Namenode將無法參與自動failover過程。
Hadoop的配置文件設置(HDFS HA)