之所以選擇 HDFS 存儲數據,因為 HDFS 具有以下優點:
當然 HDFS 也有它的劣勢,並不適合所有的場合:
HDFS 采用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分
HDFS的文件讀取原理,主要包括以下幾個步驟:
HDFS的文件寫入原理,主要包括以下幾個步驟:
namenode如何選擇在哪個datanode 存儲副本(replication)?這裏需要對可靠性、寫入帶寬和讀取帶寬進行權衡。Hadoop對datanode存儲副本有自己的副本策略,在其發展過程中壹***有兩個版本的副本策略,分別如下所示
這樣做的好處就是當NN內存受限時,能擴展內存,解決內存擴展問題,而且每個NN獨立工作相互不受影響,比如其中壹個NN掛掉啦,它不會影響其他NN提供服務,但我們需要註意的是,雖然有多個NN,分管不同的目錄,但是對於特定的NN,依然存在單點故障,因為沒有它沒有熱備,解決單點故障使用NameNode HA
2、NameNode HA
解決方案:
1、基於NFS方案
Active NN與Standby NN通過NFS實現***享數據,但如果Active NN與NFS之間或Standby NN與NFS之間,其中壹處有網絡故障的話,那就會造成數據同步問題
2、基於QJM方案
架構如下圖
Active NN、Standby NN有主備之分,NN Active是主的,NN Standby備用的
集群啟動之後,壹個namenode是active狀態,來處理client與datanode之間的請求,並把相應的日誌文件寫到本地中或JN中;
Active NN與Standby NN之間是通過壹組JN***享數據(JN壹般為奇數個,ZK壹般也為奇數個),Active NN會把日誌文件、鏡像文件寫到JN中去,只要JN中有壹半寫成功,那就表明Active NN向JN中寫成功啦,Standby NN就開始從JN中讀取數據,來實現與Active NN數據同步,這種方式支持容錯,因為Standby NN在啟動的時候,會加載鏡像文件(fsimage)並周期性的從JN中獲取日誌文件來保持與Active NN同步
為了實現Standby NN在Active NN掛掉之後,能迅速的再提供服務,需要DN不僅需要向Active NN匯報,同時還要向Standby NN匯報,這樣就使得Standby NN能保存數據塊在DN上的位置信息,因為在NameNode在啟動過程中最費時工作,就是處理所有DN上的數據塊的信息
為了實現Active NN高熱備,增加了FailoverController和ZK,FailoverController通過Heartbeat的方式與ZK通信,通過ZK來選舉,壹旦Active NN掛掉,就選取另壹個FailoverController作為active狀態,然後FailoverController通過rpc,讓standby NN轉變為Active NN
FailoverController壹方面監控NN的狀態信息,壹方面還向ZK定時發送心跳,使自己被選舉。當自己被選為主(Active)的時候,就會通過rpc使相應NN轉變Active狀態
3、結合HDFS2的新特性,在實際生成環境中部署圖
這裏有12個DN,有4個NN,NN-1與NN-2是主備關系,它們管理/share目錄;NN-3與NN-4是主備關系,它們管理/user目錄