Hadoop 分布式文件系統(HDFS)被設計成適合運行在通用硬件上的分布式文件系統,它是一個高度容錯性的系統,適合部署在廉價的機器上,能夠提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。為了做到可靠性,HDFS創建了多份數據塊的副本,并將它們放置在服務器群的計算節點中,MapReduce 可以在它們所在的節點上處理這些數據。
1.?HDFS 的設計目標
- 存儲大規模數據:HDFS 可以存儲并管理 PB 級甚至 EB 級的數據。
- 高容錯性:數據自動保存多個副本,副本丟失自動恢復
- 高吞吐量:適合流式數據訪問,支持高并發讀寫,一次寫入,可多次讀取,確保數據的一致性。
- 低成本:可以在普通硬件上運行,降低存儲成本。
2. HDFS 的設計思想和體系架構
HDFS采用主從架構。一個HDFS集群是由一個NameNode和一定數目的DataNodes 組成。其中 NameNode 是一個中心服務器,負責文件系統的名字空間(namespace)管理以及客戶端對文件的訪問。集群中的DataNode一般是一個節點一個,負責管理它所在節點上的存儲。
HDFS設計思想
從內部看,一個文件其實被分成一個或多個數據塊,這些塊存儲在一組DataNode(server)之上。NameNode執行文件系統的名字空間操作,比如打開、關閉、重命名文件或目錄,同時它也負責確定數據塊到具體DataNode節點的映射。DataNode負責處理文件系統客戶端的讀寫請求,在NameNode的統一調度下進行數據塊的創建、刪除和復制。
HDFS框架結構
?
HDFS使用Java語言開發,因此任何支持Java的機器都可以部署NameNode或DataNode。 由于采用了可移植性極強的Java語言,這就使得HDFS可以部署到幾乎所有類型的機器上。
三.NameNode
1.NameNode的作用
- 元數據管理:Namenode 是HDFS的元數據節點,負責文件系統的名字空間(Namespace)管理以及客戶端對文件的訪問。
- 文件元數據操作:NameNode 負責文件元數據的操作,如創建、刪除、重命名文件或目錄。
- 數據塊管理:NameNode 決定數據塊的副本存放在哪些 DataNode 上。讀取文件時,NameNode 會盡量讓用戶先讀取最近的副本(通過網絡拓撲距離來衡量),以降低帶寬消耗和讀取時延。
- 心跳機制:NameNode 周期性地從每個 DataNode 接收心跳信號和塊狀態報告。心跳信號表示 DataNode 工作正常,塊狀態報告包含 DataNode 上所有數據塊的信息列表。
2. NameNode 的目錄結構
NameNode 的元數據存儲在本地文件系統的以下目錄中:${dfs.name.dir}/current/
包含以下文件:
- VERSION:是Java properties 文件,保存 HDFS 的版本信息
- edits:修改日志(Edit Log),記錄對文件系統元數據的修改。存儲在本地文件系統中。
- fsimage:命名空間鏡像文件,保存整個文件系統的命名空間包括數據塊映射信息,文件屬性等等。存儲在本地文件系統中。
- fstime:記錄最后一次檢查點(checkpoint)的時間。
3. NameNode 的啟動與檢查點
NameNode 在內存中保存著整個文件系統的命名空間和文件數據塊映射的映像,這個關鍵的元數據結構設計得非常緊湊,因而一個有4G內存的NameNode就足以支撐巨大量的文件和目錄。
(1)啟動過程:
- NameNode 從硬盤讀取 FsImage 和 Edit Log。
- 將 Edit Log 中的事務應用到內存中的 FsImage。
- 將更新后的 FsImage 保存到本地磁盤,并刪除舊的 Edit Log。
(2)檢查點(Checkpoint):
- 定期將內存中的元數據保存到 FsImage,并清理 Edit Log。
- 由 Secondary NameNode 輔助完成。
4. Secondary NameNode 的作用
(1)輔助 NameNode:
- Secondary NameNode 不是 NameNode 的備用節點,而是輔助 NameNode 完成檢查點。
- 主要功能是定期合并 FsImage 和 Edit Log,防止 Edit Log 過大。
(2)檢查點過程:
- Secondary NameNode 通知 NameNode 生成新的 Edit Log。
- 從 NameNode 獲取 FsImage 和舊的 Edit Log。
- 將 FsImage 加載到內存,并應用 Edit Log 中的事務,生成新的 FsImage。
- 將新的 FsImage 傳回 NameNode。
- NameNode 更新 FsImage 和 Edit Log,并記錄檢查點時間。
Secondary NameNode并不是NameNode出現問題時候的備用節點,它和NameNode負責不同的事情。其主要功能就是周期性地將NameNode的命名空間鏡像文件和修改日志合并,以防日志文件過大。合并過后的命名空間鏡像文件也在Secondary NameNode保存了一份,以防止在 NameNode失敗的時候,可以安全恢復。Secondary NameNode 通常在一個獨立的機器上運行,它的內存要求和主 NameNode 是一樣的。Secondary NameNode在配置后通過 start-dfs.sh 啟動。
四.DateNode
1.DataNode的作用
- 數據存儲:DataNode是文件系統中真正存儲數據的地方,一個數據塊在DataNode磁盤存儲時,會存儲數據塊本身,以及元數據包括數據塊的長度、塊數據的校驗和、以及時間戳。
- 數據塊管理:DataNode是HDFS文件系統的工作節點,DataNode會按照客戶端或者是NameNode的調度來存儲和檢索數據,并定期向NameNode發送它所存儲的數據塊列表。
- 與 NameNode 通信:DataNode啟動后向NameNode注冊,注冊成功后,周期性每小時向NameNode上報所有的塊信息,心跳頻率每3秒一次,心跳返回結果帶有 NameNode 給該 DataNode 的命令,如復制塊數據到另一臺機器,或刪除某個數據塊等等。
- 節點狀態:如果 NameNode超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用。集群在運行中可以安全地加入或剔除狀態異常的機器。
2. DataNode 的目錄結構
DataNode 的數據存儲目錄結構如下:${dfs.data.dir}/current/
包含以下內容:
- VERSION:存儲 DataNode 的版本信息。
blk_<id>
:存儲數據塊的二進制數據。blk_<id>.meta
:存儲數據塊的元數據,包括校驗和、長度和時間戳。
五 .HDFS數據塊
1.數據塊大小:默認情況下,HDFS 的數據塊大小為?128MB(Hadoop 2.x 及以上版本)或?64MB(Hadoop 1.x 版本)。用戶可以根據需要調整塊大小。
2.數據塊分布:HDFS 通過數據塊副本機制實現高容錯性。默認情況下,每個數據塊會被復制到 3 個不同的 DataNode 上。
而在傳統的塊存儲介質中,塊是讀寫的最小數據單位(扇區),傳統文件系統是基于存儲塊進行操作 的,為了節省文件分配表空間,一般會對物理存儲塊進行整合,通常為 4KB 或 64KB。
那為什么HDFS 的塊遠遠大于傳統文件系統的塊?
- 塊大小較小,文件會被分割成更多的數據塊,導致元數據量大幅增加,占用大量 NameNode 內存。較大的塊大小可以減少元數據量,降低 NameNode 的內存壓力。NameNode 的元數據管理更加高效。
- 減少尋址開銷:在傳統文件系統中,較小的塊大小會導致更多的磁盤尋址操作,增加 I/O 開銷。HDFS 的較大塊大小可以減少尋址次數,提高數據訪問效率。
- HDFS 設計用于處理大規模數據,適合流式數據訪問(即順序讀取大文件)。較大的塊大小可以減少數據塊的切換頻率,提高數據讀取的吞吐量。
?