HDFS分散式文件系統是怎麼保存文件的?
首先我們先了解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。元數據寫明文件數據怎麼儲存和儲存在哪,有多少副本等等。
推薦閱讀: