Hadoop-HA機制
HA概述
high available(高可用)java
所謂HA(high available),即高可用(7*24小時不中斷服務)。node
實現高可用最關鍵的策略是消除單點故障。HA嚴格來講應該分紅各個組件的HA機制:HDFS的HA和YARN的HA。apache
Hadoop2.0以前,在HDFS集羣中NameNode存在單點故障(SPOF)。ssh
高可靠:hdfs多個副本oop
最大的做用解決:單點故障存在的問題spa
單點故障緣由:.net
NameNode機器發生意外,如宕機,集羣將沒法使用,直到管理員重啓3d
NameNode機器須要升級,包括軟件、硬件升級,此時集羣也將沒法使用日誌
NameNode故障解決code
HDFS HA功能經過配置Active/Standby兩個nameNodes實如今集羣中對NameNode的熱備來解決上述問題。
若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將NameNode很快的切換到另一臺機器
HA的運做機制(重點)
涉及組件:
一、zookeeper:協調主備namenode的切換
二、qjournal:主備namenode的數據同步
三、zkfc:它zookeeper的客戶端應用,主要檢測namenode的健康狀態
四、active namenode:激活的namenode
五、standby namenode:備用的namenode
HDFS-HA工做要點
元數據管理方式須要改變
須要一個狀態管理功能模塊
必須保證兩個NameNode之間可以ssh無密碼登陸。
隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
元數據管理方式
內存中各自保存一份元數據
Edits日誌只有Active狀態的namenode節點能夠作寫操做
兩個namenode均可以讀取edits
共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現)
狀態管理功能模塊
實現了一個zkfailover,常駐在每個namenode所在的節點,每個zkfailover負責監控本身所在namenode節點,
利用zk進行狀態標識,當須要進行狀態切換時,由zkfailover來負責切換,切換時須要防止brain split現象的發生
故障轉移工做機制
自動故障轉移爲HDFS部署增長了兩個新組件:ZooKeeper和ZKFailoverController(ZKFC)進程。
Zookeeper做用
故障檢測
集羣中的每一個NameNode在ZooKeeper中維護了一個持久會話,若是機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另外一個NameNode須要觸發故障轉移。
現役NameNode選擇
ZooKeeper提供了一個簡單的機制用於惟一的選擇一個節點爲active狀態。若是目前現役NameNode崩潰,另外一個節點可能從ZooKeeper得到特殊的排外鎖以代表它應該成爲現役NameNode。
ZKFC
ZKFC是自動故障轉移中的另外一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每一個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:
健康監測
active選擇
jdbcClient訪問Ha集羣環境
package com.gec.demo; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class HdfsClientApp { public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException { Configuration configuration=new Configuration(); FileSystem fileSystem= FileSystem.get(new URI("hdfs://bi/"),configuration,"hadoop"); // 2 把本地文件上傳到文件系統中 fileSystem.copyFromLocalFile(new Path("D:/hello.txt"), new Path("/hello1.copy.txt")); // 3 關閉資源 fileSystem.close(); } }
注意要將如下配置文件copy到resource文件夾中。不然會報錯!!!