1. 程式人生 > >Hadoop之HA高可用性

Hadoop之HA高可用性

HDFS HA架構部署
1、準備
一個完全分散式的Hadoop環境
一個完全分散式的zookeeper環境
為了保證出錯可以恢復,建議重新備份一份完全分散式的環境
2、在配置之前,先關閉整個叢集的所有服務
3、修改hdfs-site.xml檔案
-》將secondarynamenode引數刪除,不需要
-》給namenode管理的元資料空間起一個邏輯名稱
<property>
 <name>dfs.nameservices</name>
 <value>ns1</value>
</property>

-》指定兩個namenode的邏輯名稱
<property>
 <name>dfs.ha.namenodes.ns1</name>
 <value>nn1,nn2</value>
</property>

-》指定兩個namenode的例項,RPC內部通訊,監聽地址
<property>
 <name>dfs.namenode.rpc-address.ns1.nn1</name>
 <value>bigdata-01.yushu.com:8020</value>
</property>
<property>
 <name>dfs.namenode.rpc-address.ns1.nn2</name>
 <value>bigdata-02.yushu.com:8020</value>
</property>

-》指定兩個namenode的例項,http監聽地址
<property>
 <name>dfs.namenode.http-address.ns1.nn1</name>
 <value>bigdata-01.yushu.com:50070</value>
</property>
<property>
 <name>dfs.namenode.http-address.ns1.nn2</name>
 <value>bigdata-02.yushu.com:50070</value>
</property>

-》指定journalnode日誌節點的uri
<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://bigdata-01.yushu.com:8485;bigdata-02.yushu.com:8485;bigdata-03.yushu.com:8485/ns1</value>
</property>

-》指定JN本地儲存日誌的路徑
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/app/moduels/hadoop-2.5.0/data/dfs/jn</value>
</property>


       ->>配置代理
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

-》指定選擇哪個隔離的方案,選擇SSH
<property>
 <name>dfs.ha.fencing.methods</name>
 <value>sshfence</value>
</property>


<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/home/ds/.ssh/id_rsa</value>
</property>

-》指定是否開啟自動故障轉移功能
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>


-》修改core-site.xml檔案,指定ZK的例項和埠號
<property>
  <name>ha.zookeeper.quorum</name>
  <value>bigdata-01.yushu.com:2181,bigdata-02.yushu.com:2181,bigdata-03.yushu.com:2181</value>
</property>
 
-》指定管理的名稱空間
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
4、將配置檔案分發到各個節點上
$ scp -r etc/hadoop/ bigdata-02.yushu.com:/opt/app/hadoop-2.5.0/etc/
$ scp -r etc/hadoop/ bigdata-03.yushu.com:/opt/app/hadoop-2.5.0/etc/


5、首先先啟動所有節點的ZK
bin/zkServer.sh start
6、再啟動所有節點的JN
$ sbin/hadoop-daemon.sh start journalnode
7、如果是一個新的叢集那麼需要首次格式化namenode,如果不是新的叢集可以不用
bin/hdfs namenode -format
只需要格式化一臺,因為兩個namenode管理的是同一個元資料空間
注意:先啟動第一臺的namenode再操作下面的元資料同步
sbin/hadoop-daemon.sh start namenode
8、同步元資料
切換到第二臺的namenode機器,執行元資料的同步
可以使用bin/hdfs namenode -help引數檢視shell命令
$ bin/hdfs namenode -bootstrapStandby
啟動三臺機器的 datanode  sbin/hadoop-daemon.sh start datanode
9、先暫時停掉兩臺namenode服務程序
10、ZKFC監聽器
DFSZKFailoverController
11、初始化ZKFC
$ bin/hdfs zkfc -formatZK
進入ZK的客戶端,檢查是否生產了hadoop-ha的節點目錄
12、在兩臺namenode所在的機器去分別啟動ZKFC監聽器
$ sbin/hadoop-daemon.sh start zkfc
13、啟動兩臺 namenode


總結流程:
1、ZKFC監控namenode的狀態(active狀態的)
2、ZKFC連結zookeeper,進行選舉,在後續的階段中保持心跳
3、另一個ZKFC也會去監控對應的namenode
4、ZKFC連結zookeeper,進行選舉,在後續的階段中保持心跳
5、active namenode出現異常
6、ZKFC會在監控週期中檢測到active失效,觸發故障切換的流程
7、ZKFC記錄失敗的active的資訊,去通知standby的ZKFC
8、standby的ZKFC接收到通訊,進入切換流程,首先進行隔離,確保失效的active隔離在叢集外
9、ZKFC進行選舉,確認自己成為新的active節點
10、選舉後,通知本機從standby切換到了active,然後正式接管叢集,相應外部請求處理任務