首先我們先了解HDFS有哪些特性,設計初衷是什麼,為瞭解決什麼問題。

1,解決硬體錯誤問題。HDFS能夠錯誤自檢,快速自動恢復。

2,高吞吐量。HDFS中更多的是考慮數據的批處理,而不是用戶的交互處理。

3,大規模的數據。能在一個集羣裡面很容易擴展到數百個節點。

4,簡單的一致性模型。一個文件經過創建、寫入和關閉之後就不需要改變。一次寫入多次讀取。從而簡化了數據一致性的問題,並且使高吞吐量的數據訪問成為可能。

5,移動計算比移動數據更加划算。HDFS為應用提供了將他們移動到數據附近的介面。

6,HDFS採取Master-Slave架構。一個Hdfs由一個namenode和一定數目的datanodes組成。

下圖是HDFS架構示意圖:

HDFS如何管理文件

1,HDFS支持層次型文件組織結構。文件系統名字空間的層次結構和大多數的文件系統類似,用戶可以創建、刪除、移動或者重命名文件。HDFS不支持用戶磁碟配額和反問許可權控制,不支持軟鏈接和硬鏈接,不支持文件的執行許可權。NameNode負責維護文件系統的命名空間,任何對文件的修改都被NameNode記錄下來。

2,Hdfs將元數據信息存儲在fsimag和edits。我們可以看看fsimag和edits中的內容。

3,HDFS的元數據存儲機制:內存中有一份完整的元數據(內存meta data);磁碟有一個「準完整」的元數據鏡像(fsimage)文件存儲在namenode的工作目錄中

4,NameNode如何管理元數據。

HDFS如何存儲文件

1,數據文件存儲在DataNode節點上,維護了blockId餘DataNode本地文件的映射。需要保持和NameNode之間的心跳,來告知自己的信息,方便NameNode來管控集羣。

2,Hdfs存儲的最小單位是塊。一個塊默認是128M或者256M,每個塊默認都存儲三分。當然問價塊的默認大小和存儲數量都是可以調整的。

3,Hdfs如何寫入文件。

文件按照流失的放入進行寫入。一開始是寫到本地臨時文件中,當本地臨時文件累積到一個數據塊的大小時,客戶端會從Namenode獲取一個Datanode列表用於存放副本。

寫入流程詳細解釋如下:

第一步:客戶端向NameNode發出寫文件請求。

第二步:檢查是否已存在文件、檢查許可權。若通過檢查,直接先將操作寫入EditLog,並返回輸出流對象。

第三步:client端按設置的塊大小切分文件。

第四步:client將NameNode返回的分配的可寫的DataNode列表和Data數據一同發送給最近的第一個DataNode節點,此後client端和NameNode分配的多個DataNode構成pipeline管道,client端向輸出流對象中寫數據。client每向第一個DataNode寫入一個packet,這個packet便會直接在pipeline裏傳給第二個、第三個…DataNode。

第五步:返回確認消息

第六步:寫完數據關閉數據流

第七步:發送完成信號給NameNode

HDFS保存文件的注意事項

1,WAL,write ahead log,先寫Log,再寫內存,因為EditLog記錄的是最新的HDFS客戶端執行所有的寫操作。如果後續真實寫操作失敗了,由於在真實寫操作之前,操作就被寫入EditLog中了,故EditLog中仍會有記錄,我們不用擔心後續client讀不到相應的數據塊,因為在第5步中DataNode收到塊後會有一返回確認信息,若沒寫成功,發送端沒收到確認信息,會一直重試,直到成功。

2,Hdfs通過校驗和,來保障數據的一致性。

3,假設寫2T的數據,我們設置的是三個備份,那麼需要6T的存儲。

4,在讀寫的過程中,如果發現DataNode掛掉了,會把死掉的節點的數據,複製到其它節點上去。

5,掛掉一個節點,甚至掛掉一個機架也沒有關係,在其它節點或者機架上有備份。如圖HDFS副本放置策略。

以上我對這個問題的理解,您覺得hdfs還有那些問題沒有說明的,關注頭條號:數據僧,微信公眾號:數據僧。在評論區留言,我們一起討論學習。


hdfs保存數據分為三步,分別為元數據保存、數據儲存和備份,元數據儲存在namenode,文件數據及其副本儲存在datanode。元數據寫明文件數據怎麼儲存和儲存在哪,有多少副本等等。


推薦閱讀:
相關文章