HDFS原理理解(一) 基本數據存儲和讀寫

1、HDFS簡介:

Hadoop分佈式文件系統(HDFS)被設計成適合運行在通用硬件上的分佈式文件系統。HDFS有三類節點,一類是NameNode,又名“名稱節點/元數據節點”;另一類是DataCode(數據節點),還有一個是Secondary NameCode(第二名稱節點)

物理磁盤中有塊的概念,磁盤的物理Block是磁盤操作最小的單元,讀寫操作均以Block爲最小單元,一般爲512 Byte。HDFS的Block塊比一般單機文件系統大得多,默認爲128M。HDFS的文件被拆分成block-sized的chunk,chunk作爲獨立單元存儲。比Block小的文件不會佔用整個Block,只會佔據實際大小。例如, 如果一個文件大小爲1M,則在HDFS中只會佔用1M的空間,而不是128M。

HDFS的Block爲什麼這麼大? 
是爲了最小化查找(seek)時間,控制定位文件與傳輸文件所用的時間比例。假設定位到Block所需的時間爲10ms,磁盤傳輸速度爲100M/s。如果要將定位到Block所用時間佔傳輸時間的比例控制1%,則Block大小需要約100M。 
但是如果Block設置過大,在MapReduce任務中,Map或者Reduce任務的個數 如果小於集羣機器數量,會使得作業運行效率很低。
    

2、HDSF架構設計

è¿éåå¾çæè¿°

角色分配

  • è¿éåå¾çæè¿°

Client:客戶端,系統使用者,調用HDSF API操作文件,與NameNode交互獲取文件元數據,與DateNode交互進行數據讀寫。

NameNode

          存儲:

               1)文件系統的命名空間,文件名稱,文件目錄結構,文件的屬性(權限、創建時間、副本數

               2)文件對應哪些數據塊,數據塊對應哪些dataNode節點。

               3)nameNode節點不會持久的存儲這種映射關係,是通過集羣在啓動和運行時,datanode定時發送BlockReport給NameNode,從此NameNode在內存中動態維護這種映射關係。

        作用:管理文件系統的命名空間,它維護着文件系統數以及整顆數的所有文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上:命名空間鏡像文件fsImage和編輯日誌文件editlog.

         高可用:採用HA的HDFS集羣配置兩個NameNode,分別處於Active和Standby狀態。當Active NameNode故障之後,Standby接過責任繼續提供服務,用戶沒有明顯的中斷感覺。一般耗時在幾十秒到數分鐘。 

DataNode:

        存儲:

              1) 數據塊和數據塊校驗和

              2)與NameNode通信:每隔3秒發送一個心跳包,每10次心跳發送一次blockReport。

        作用:讀寫文件的數據快。 

SecondaryNode:並非 NameNode 的熱備。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務。

        存儲:fsImage+editLog。

        作用:

             1)輔助 NameNode,分擔其工作量。

             2)定期合併fsimage+editlog文件作爲新的fsimage推送給nameNode,俗稱檢查點動作,checkpoint。

             3)在緊急情況下,可輔助恢復 NameNode。

        參數:fs.checkpoint.period->1h    fs.checkpoint.size->64M          

角色定位:

è¿éåå¾çæè¿°

客戶端:負責文件切割

NameNode:爲數據庫分配DN地址

DataNode:存儲數據,並將數據冗餘備份到多個DataNode中。

文件寫入流程

用戶向客戶端發送請求:

è¿éåå¾çæè¿°

用戶在寫入請求的時候,需要設定文件的分割大小以及備份文件大小。

文件切分:

               Client根據用戶的需求,將文件分割成多份

è¿éåå¾çæè¿°

文件分配:

                 然後Client去NameNode請求,NameNode通過計算出N個分配的DateNode地址(通過舉例進行了排序,優先本地磁盤上有一個)。

è¿éåå¾çæè¿°

數據寫入:

        Client根據NameNode提供的地址,開始寫入數據塊,當第一個DataNode接收到地址的時候,會按照距離的順序會依次同步數據。

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

è¿éåå¾çæè¿°

寫入成功

              當每個DataNode完成數據寫入後,都會向NameNode發送通知,告知自己寫完了數據。

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

è¿éåå¾çæè¿°

文件讀取流程

HDFS採用的是“一次寫入多次讀取”的文件訪問模型,一個文件經過創建、寫入和關閉之後,就不需要改變。這一假設簡化了數據一致性問題,並且使高吞吐量的數據訪問成爲了可能

è¿éåå¾çæè¿°

用戶需求:

è¿éåå¾çæè¿°

客戶端向NameNode發送請求:

è¿éåå¾çæè¿°

NameNode返回該文件的部分或者全部的block列表:

         Client獲得文件的第一批block的locations,同一block按照重複數會返回多個locations,這些locations按照Hadoop拓撲結構排序,距離客戶端近的排在前面。

è¿éåå¾çæè¿°

讀取數據(就近原則)

è¿éåå¾çæè¿°

 

注意:在讀取的時候,如果client與datanode通信時遇到一個錯誤,那麼它就會去嘗試對這個塊來說下一個最近的塊。它也會記住那個故障節點的datanode,以保證不會再對之後的塊進行徒勞無益的嘗試。client也會確認datanode發來的數據的校驗和。如果發現一個損壞的塊,它就會在client試圖從別的datanode中讀取一個塊的副本之前報告給namenode。 
總結:這個設計的一個重點是,client直接聯繫datanode去檢索數據,並被namenode指引到塊中最好的datanode。因爲數據流在此集羣中是在所有datanode分散進行的。所以這種設計能使HDFS可擴展到最大的併發client數量。同時,namenode只不過提供塊的位置請求(存儲在內存中,十分高效),不是提供數據。否則如果客戶端數量增長,namenode就會快速成爲一個“瓶頸”。

 

 

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