HDFS筆記(特點、原理與基本架構)

  • 產生背景
以文件爲基本存儲單位的缺點
1、文件大小不同,難以實現負載均衡。
2、處理一個文件時,只能利用一個節點資源,無法動用集羣。

  • HFDS的定義
源自於Google的GFS論文
    發表於2003年10月
    HDFS是GFS克隆版
Hadoop Distributed File System
    易於擴展的分佈式文件系統
    運行在大量普通廉價機器上,提供容錯機制
    爲大量用戶提供性能不錯的文件存取服務
  • HDFS的優缺點
優點
1)高容錯性
    數據自動保存多個副本
    副本丟失後,自動恢復
2)適合批處理
    移動計算而非數據
    數據位置暴露給計算框架
3)適合大數據處理
    GB、TB、甚至PB級數據
    百萬規模以上的文件數量
    10K+節點規模
4)流式文件訪問
    一次性寫入,多次讀取
    保證數據一致性
5)可構建在廉價機器上
    通過多副本提高可靠性
    提供了容錯和恢復機制
不擅長:
1)低延遲與高吞吐率的數據訪問 ,比如毫秒級
2)小文件存取
    佔用NameNode大量內存 
    尋道時間超過讀取時間 
3)併發寫入、文件隨機修改
    一個文件同一個時間只能有一個寫者
    僅支持append

  • HDFS架構



Client:切分文件;訪問或通過命令行管理HDFS;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數據。
NameNode:Master節點,只有一個,管理HDFS的名稱空間和數據塊映射信息;配置副本策略;處理客戶端請求。
DataNode:Slave節點,存儲實際的數據;執行數據塊的讀寫;彙報存儲信息給NameNode。
Secondary NameNode:輔助NameNode,分擔其工作量;定期合併fsimage和fsedits,推送給NameNode;緊急情況下,可輔助恢復NameNode,但Secondary NameNode並非NameNode的熱備。
fsimage和fsedits
NameNode中兩個很重要的文件,
fsimage是元數據鏡像文件(保存文件系統的目錄樹)。
edits是元數據操作日誌(記錄每次保存fsimage之後到下次保存之間的所有hdfs操作)。
內存中保存了最新的元數據信息(fsimage和edits)。
edits過大會導致NameNode重啓速度慢,Secondary NameNode負責定期合併它們。

合併的流程圖:
數據塊的映射關係
1)包括兩種:文件與數據塊映射關係,DataNode與數據塊映射關係;
2)NameNode啓動的時候,可通過心跳信息重構映射信息,DataNode運行過程中定時彙報當前block信息;映射關係保存在NameNode內存中。
3)NameNode重啓速度慢(需要加載通過合併fsimage與edits文件生成的最新目錄樹以及DataNode的塊信息)
數據塊(block)
1)在HDFS中,文件被切分成固定大小的數據塊,默認大小爲64MB,也可自己配置。
2)爲何數據塊如此大,因爲數據傳輸時間超過尋道時間(高吞吐率)。
3)文件的存儲方式:按大小被切分成若干個block,存儲到不同節點上,默認情況下每個block有三個副本。
對於block塊的恢復詳細信息可以查看如下blog
http://blog.csdn.net/macyang/article/details/7983188
HDFS的默認副本存放策略
Hadoop 0.17 之後:副本1-同Client的節點上;副本2-不同機架中的節點上;副本3-同第二個副本的機架中的另一個節點上;其他副本:隨機挑選。如下圖示例:


  • HDFS可靠性機制
常見錯誤情況:文件損壞;網絡或者機器失效;NameNode掛掉;
文件的完整性:通過CRC32校驗,如果有損壞,用其他副本替代損壞文件;
Heartbeat:DataNode定期向NameNode發送eartbeat;
元數據信息:FsImage、Editlog進行多份備份,當NameNode宕機後,可手動還原。


  • HDFS物理網絡環境


  • HDFD的讀寫流程
這個網站很詳細很好:http://bradhedlund.com/2011/09/10/understanding-hadoop-clusters-and-the-network/

HDFS文件讀取:


1.首先調用FileSystem對象的open方法,其實是一個DistributedFileSystem的實例
2.DistributedFileSystem通過rpc獲得文件的第一批個block的locations,同一block按照重複數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面.
3.前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方法,DFSInputStream最會找出離客戶端最近的datanode並連接。
4.數據從datanode源源不斷的流向客戶端。
5.如果第一塊的數據讀完了,就會關閉指向第一塊的datanode連接,接着讀取下一塊。這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個持續不斷的流。
6.如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的塊都讀完,這時就會關閉掉所有的流。

HDFS讀取發生異常處理
       如果在讀數據的時候,DFSInputStream和datanode的通訊發生異常,就會嘗試正在讀的block的排第二近的datanode,並且會記錄哪個datanode發生錯誤,剩餘的blocks讀的時候就會直接跳過該datanode。DFSInputStream也會檢查block數據校驗和,如果發現一個壞的block,就會先報告到namenode節點,然後DFSInputStream在其他的datanode上讀該block的鏡像
HDFS讀操作設計思考
       客戶端直接連接datanode來檢索數據並且namenode來負責爲每一個block提供最優的datanode,namenode僅僅處理block location的請求,這些信息都加載在namenode的內存中,hdfs通過datanode集羣可以承受大量客戶端的併發訪問。

HDFS文件寫入

1.客戶端通過調用DistributedFileSystem的create方法創建新文件
2.DistributedFileSystem通過RPC調用namenode去創建一個沒有blocks關聯的新文件,創建前,namenode會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,namenode就會記錄下新文件,否則就會拋出IO異常.
3.前兩步結束後會返回FSDataOutputStream的對象,和讀文件的時候相似,FSDataOutputStream被封裝成DFSOutputStream,DFSOutputStream可以協調namenode和datanode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然後排成隊列data quene。
4.DataStreamer會去處理接受data quene,他先問詢namenode這個新的block最適合存儲的在哪幾個datanode裏,比如重複數是3,那麼就找到3個最適合的datanode,把他們排成一個pipeline.DataStreamer把packet按隊列輸出到管道的第一個datanode中,第一個datanode又把packet輸出到第二個datanode中,以此類推。
5.DFSOutputStream還有一個對列叫ack quene,也是有packet組成,等待datanode的收到響應,當pipeline中的所有datanode都表示已經收到的時候,這時akc quene纔會把對應的packet包移除掉。
6.客戶端完成寫數據後調用close方法關閉寫入流
7.DataStreamer把剩餘得包都刷到pipeline裏然後等待ack信息,收到最後一個ack後,通知datanode把文件標示爲已完成。
HDFS文件寫入失敗
       如果在寫的過程中某個datanode發生錯誤,會採取以下幾步:
       1.pipeline被關閉
       2.爲了防止防止丟包ack quene裏的packet會同步到data quene
       3.把產生錯誤的datanode上當前在寫但未完成的block刪
       4.block剩下的部分被寫到剩下的兩個正常的datanode
       5.namenode找到另外的datanode去創建這個塊的復
       這些操作對客戶端來說是無感知的。
       (客戶端執行write操作後,寫完得block纔是可見的,正在寫的block對客戶端是不可見的,只有調用sync方法,客戶端才確保該文件被寫操作已經全部完成,當客戶端調用close方法時會默認調用sync方法。是否需要手動調用取決你根據程序需要在數據健壯性和吞吐率之間的權衡。)

注:此部分筆記來源於:http://bbs.chinahadoop.cn/forum.php?mod=viewthread&tid=5673&fromuid=696

  • HDFS與其他系統的結合
1)HDFS與MapReduce結合
MapReduce作業的輸入數據來自HDFS,最終結果也寫入HDFS
Mapreduce和HDFS是低耦合的,Mapreduce可以與其他分佈式系統結合。HDFS之上可以是其他框架。
2)HDFS與Hbase結合
HDFS爲Hbase提供可靠的數據存放服務(操作日誌文件WAL和數據索引文件HFile等)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章