大數據之Hadoop分佈式文件系統(HDFS)篇之一

軟件開發漫談 2017-04-28

簡介

HADOOP DISTRIBUTED FILE SYSTEM,簡稱HDFS,是一個分佈式文件系統。它是谷歌的GFS提出之後出現的另外一種文件系統。它的設計目標是把超大數據集存儲到分佈在網絡中的多臺普通商用計算機上,並且能夠提供高可靠性和高吞吐量的服務。分佈式文件系統要比普通磁盤文件系統複雜。因為它要引入網絡編程。HDFS 提供了一個高度容錯性和高吞吐量的海量數據存儲解決方案。

HADOOP最初是作為Apache Nutch搜索引擎項目的基礎架構而開發的,後來讓它成為HADOOP CORE項目的一部分。它的項目的地址是http://hadoop.apache.org/core/

設計前提和目標

專為存儲超大文件而設計:HDFS能夠支持GB級別大小的文件,它能夠提供很大的數據帶寬並且能夠在集群中拓展到成百上千個節點,它的一個實例應該能夠支持千萬數量級別的文件。

適用於流式的數據訪問:HDFS適用於批處理的情況而不是交互式處理,它的重點是保證高吞吐量而不是低延遲的用戶響應。

容錯性:完善的冗餘備份機制。

支持簡單的一致性模型:HDFS需要支持一次寫入多次讀取的模型,而且寫入過程文件不會經常變化。

移動計算優於移動數據:一個應用請求的計算,離它操作的數據越近就越高效,在數據達到海量級別的時候更是如此。因為這樣就能降低網絡阻塞的影響,提高系統數據的吞吐量。將計算移動到數據附近,比之將數據移動到應用所在顯然更好。HDFS提供了使應用計算移動到離它最近數據位置的接口(減少數據傳輸)。

兼容各種硬件和軟件平臺:如linux、window系統都可以安裝部署併兼容使用

架構和設計

大數據之Hadoop分佈式文件系統(HDFS)篇之一

HDFS主要由3個組件構成:分別是NameNodeSecondaryNameNodeDataNode,HSFS是以master/slave模式運行的,其中NameNode、SecondaryNameNode 運行在master節點,DataNode運行slave節點。

NameNode中心服務器(Master):維護文件系統樹、以及整棵樹內的文件目錄、負責整個數據集群的管理。如:元數據信息,比如命名空間信息,塊信息。

SecondaryNameNode:它給人的感覺就像是NameNode的備份,但它實際上卻不是。經常由於名字而被人誤解它真正的用途。其實它真正的用途是用來合併fsimage和edits文件來更新NameNode和metadata的,並減少NameNode重啟的時間。

如下圖所示:

大數據之Hadoop分佈式文件系統(HDFS)篇之一

1.NameNode管理著元數據信息,metadata信息會定期的刷到磁盤中,其中的兩個文件是edits即操作日誌文件和fsimage即metadata鏡像文件,新的操作日誌不會立即與fsimage進行合併,也不會刷到NameNode的內存中,而是會先寫到edits中(因為合併需要消耗大量的資源)。當edits文件的大小達到一個臨界值(默認是64MB)或者間隔一段時間(默認是1小時)的時候checkpoint會觸發SecondaryNameNode進行工作。

2.當觸發一個checkpoint操作時,NameNode會生成一個新的edits即上圖中的edits.new文件,同時SecondaryNameNode會將edits文件和fsimage複製到本地。

3.SecondaryNameNode將本地的fsimage文件加載到內存中,然後再與edits文件進行合併生成一個新的fsimage文件即上圖中的Fsimage.ckpt文件。

4.SecondaryNameNode將新生成的Fsimage.ckpt文件複製到NameNode節點。

5.NameNode結點的edits.new文件和Fsimage.ckpt文件會替換掉原來的edits文件和fsimage文件,至此,剛好是一個輪迴即在NameNode中又是edits和fsimage文件了。

6.等待下一次checkpoint觸發SecondaryNameNode進行工作,一直這樣循環操作。

DataNode分佈在不同的機架上(Slaver):在客戶端或者NameNode的調度下,存儲並檢索數據塊,並且定期向NameNode發送所存儲的數據塊的列表。

做個比喻:NameNode相當項目經理來制定軟件開發計劃,分配程序員工作,整體架構設計,開發過程中監工,NameNode是程序員,根據分配任務具體開發系統功能。SecondaryNameNode是項目助理整理文檔什麼的。可能不是很恰當。

工作原理

HDFS 讀取文件步驟圖如下:

大數據之Hadoop分佈式文件系統(HDFS)篇之一

詳解如下:

1.首先調用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。

2.DistributedFileSystem通過RPC(遠程過程調用)獲得文件的第一批block的locations,同一block按照重複數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面。

3.前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream可以方便的管理DataNodeNameNode數據流。客戶端調用read方 法,DFSInputStream就會找出離客戶端最近的DataNode並連接DataNode

4.數據從DataNode源源不斷的流向客戶端。

5.如果第一個block塊的數據讀完了,就會關閉指向第一個block塊的DataNode連接,接著讀取下一個block塊。這些操作對客戶端來說是透明的,從客戶端的角度來看只是讀一個持續不斷的流。

6.如果第一批block都讀完了,DFSInputStream就會去NameNode拿下一批blocks的location,然後繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。

HDFS 文件寫入步驟圖如下:

大數據之Hadoop分佈式文件系統(HDFS)篇之一

HDFS的文件寫入原理詳解如下:

1.客戶端通過調用 DistributedFileSystem 的create方法,創建一個新的文件。

2.DistributedFileSystem 通過 RPC(遠程過程調用)調用 NameNode,去創建一個沒有blocks關聯的新文件。創建前,NameNode 會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,NameNode就會記錄下新文件,否則就會拋出IO異常。

3.前兩步結束後會返回 FSDataOutputStream 的對象,和讀文件的時候相似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 可以協調 NameNodeDataNode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然後排成隊列 data queue。

4.DataStreamer 會去處理接受 data queue,它先問詢 NameNode這個新的 block 最適合存儲的在哪幾個DataNode裡,比如重複數是3,那麼就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode中,第一個 DataNode又把 packet 輸出到第二個 DataNode中,以此類推。

5.DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue才會把對應的packet包移除掉。

6.客戶端完成寫數據後,調用close方法關閉寫入流。

7.DataStreamer 把剩餘的包都刷到 pipeline 裡,然後等待 ack 信息,收到最後一個 ack 後,通知 DataNode把文件標示為已完成。

注:HDFS篇之一先介紹這裡,計劃為HDFS寫

HDFS篇之二講解Hadoop安裝過程與HDFS常用命令。

HDFS篇之三講解結合java語言的J2EE工程調用HDFS開發。

相關推薦

推薦中...