1. 程式人生 > >Hadoop的配置文件設置(HDFS HA)

Hadoop的配置文件設置(HDFS HA)

stop love edi 搶占 守護 core .html 搶占式 zookeep

參考: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
JournalNode
DFSZKFailoverController
QuorumPeerMain
ResourceManager

slave1

192.168.2.2

Y

Y

Y

Y

Y

Y

NameNode
JournalNode
DFSZKFailoverController
DataNode
QuorumPeerMain
ResourceManager
NodeManager

slave2

192.168.2.3

 

Y

 

Y

Y

Y

JournalNode
DataNode
QuorumPeerMain
NodeManager

1:原理

hadoop 2.x 中支持NFS及QJM (Quorum Journal Manager), QJM 是由Cloudera 提出的基於Paxos的方案

技術分享圖片

Hadoop提供了ZKFailoverController角色,部署在每個NameNode的節點上,作為一個deamon進程, 簡稱zkfc,示例圖如下

技術分享圖片

ZKFailoverController 主要包括三個組件:

  1. HealthMonitor:    監控NameNode是否處於unavailable或unhealthy狀態,當前通過RPC調用NN相應的方法完成
  2. ActiveStandbyElector: 管理和監控自己在ZK中的狀態
  3. ZKFailoverController 它訂閱HealthMonitor 和ActiveStandbyElector 的事件,並管理NameNode的狀態

ZKFailoverController主要職責:

  1. 健康監測:周期性的向它監控的NN發送健康探測命令,從而來確定某個NameNode是否處於健康狀態,如果機器宕機,心跳失敗,那麽zkfc就會標記它處於一個不健康的狀態
  2. 會話管理:如果NN是健康的,zkfc就會在zookeeper中保持一個打開的會話,如果NameNode同時還是Active狀態的,那麽zkfc還會在Zookeeper中占有一個類型為短暫類型的znode,當這個NN掛掉時,這個znode將會被刪除,然後備用的NN,將會得到這把鎖,升級為主NN,同時標記狀態為Active
  3. 當宕機的NN新啟動時,它會再次註冊zookeper,發現已經有znode鎖了,便會自動變為Standby狀態,如此往復循環,保證高可靠,需要註意,目前僅僅支持最多配置2個NN
  4. 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)