HDFS結構體系和核心流程分析

近年來,隨着大數據行業的興起,hadoop在技術圈內也混得風生水起。hadoop起源於谷歌關於處理大數據量的計算和存儲的兩篇論文,遵循分而治之,優先計算的思想設計。個人感覺hadoop在計算的思想上跟Java中的fork-join框架很相似。

hadoop包含hadoop common、HDFS、MapReduce這三個組件。HDFS是基於Master-Slave實現的分佈式文件系統,Master是NameNode,Slave是DataNode。

1. NameNode

NameNode基於內存,不會與磁盤發生數據交換,收集DataNode彙報的Block塊信息。NameNode基於內存存儲必然涉及到數據持久化,它採用數據快照+日誌記錄的方式實現節點數據的持久化。NameNode會定時生成一個數據快照文件fsimage,同時會將所有的操作日誌記錄到edits文件,通過這兩個文件的相互輔助便可實現數據的恢復。

2. SecondaryNameNode

SecondaryNameNode可以看成是輔助角色。隨着集羣運行的時間越來越久,edits日誌文件會記錄很多數據,比如,集羣運行了1年,edits保存了1年的操作記錄,數據恢復時,需要再用1年時間才能跑完所有的edits操作記錄,這顯然是不現實的。

SecondaryNameNode便是做合併日誌文件處理,可以將數據快照文件fsimage與edits合併成一個新的fsimage。可以通過設定閾值(默認64M)或定時的方式實現,持久化機制跟Redis的持久化機制很像。

值得注意的是,HDFS2.x在設計上已經取消改節點,轉而將處理的工作交由NamNode從節點處理。

3. Block塊

HDFS會將存儲的數據分成多個Block快進行存儲,例如10GB可以分成多個64MB的數據塊存儲。對於一個文件拆分的每個塊的大小都是相同的,每一個Block塊會有與之對應的2個副本的存在,主要是爲了提高系統的容錯性。



拆分規則是以字節爲單位,而一個漢字則是2個字節,拆分成多個Block塊,有可能就會涉及到一個漢字被分割在不同的塊。對此HDFS在讀取的時候有相應的補償機制,感興趣的可自行了解。

4. DataNode

DataNode本地磁盤目錄存儲數據,定時向NameNode彙報Block塊信息,HDFS設計存儲在廉價機器上,因此也實現了一些校驗數據和故障轉移的策略。

故障轉移:超過一定時間NameNode沒有接收到DataNode的數據就認爲改節點G了,就會copy上面的數據到其他DataNode
文件校驗:DataNode會保存一份存儲在自己節點上Block的元數據MD5加密文件,用作文件讀取時候的對比

HDFS是基於分佈式架構進行設計,能提供高容錯,Block副本丟失後會自動恢復,適合大數據處理。但與之對應的,它無法實現低延遲數據訪問,無法併發的寫入和任意修改,只能是append,不適合小文件存儲(小文件存儲會在NameNode節點中存儲比較多信息,浪費資源)。

HDFS2.x採用zookeeper實現NameNode主從節點選舉,切換,監控;採用JournalNode集羣共享NameNode節點的日誌數據;DataNode則向主NameNode彙報。結構大體如下圖:



以上大體瞭解了HDFS結構體系和組成元素,再介紹一下HDFS的核心功能(讀寫流程)。

5. 寫流程

HDFS通過客戶端寫入文件,會先向NameNode申請存儲Block塊的路徑,通過FSDataOutputStream將文件寫入到對應的DataNode節點並通過ack確認數據寫入成功。此時客戶端已完成寫入操作,但DataNode會遵循Block副本的放置策略,將Block數據另外同步給其他兩個節點。大體流程如下圖:


6. 讀流程

HDFS通過客戶端讀取文件,會先訪問NameNode,獲取文件Block塊的放置信息,再直接訪問對應DataNode獲取文件數據。大體流程如下:


小結

以上便是”關於HDFS結構體系和核心讀寫的介紹“的所有內容。如果您有什麼疑問或者文章有什麼問題,歡迎私信或留言交流~

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