大資料 | HDFS 元資料持久化筆記

語言: CN / TW / HK

早期文章

一、HDFS 架構簡單介紹

HDFS 是一個主從(Master/Slaves)的架構,它由一個 NameNode 和一些 DataNode 組成。其中,NameNode 是主,DataNode 是從。檔案元資料由 NameNode 負責儲存和管理,且它維護了一個層次型的檔案目錄樹;檔案的資料由 DataNode 來按照 block 進行儲存,並按照 block 進行讀寫。DataNode 與 NameNode 通過心跳來維持,DataNode 會向 NameNode 彙報自己持有的  block 資訊。當客戶端和 NameNode 互動檔案元資料,和 DataNode 互動 block 資料。

二、角色功能

從 HDFS 的架構來看,它包含兩個重要的角色,分別是 NameNode 和 DataNode。其中,NameNode 完全基於記憶體儲存檔案元資料、目錄結構、檔案 block 的對映,因此,它需要持久化方案來保證資料的可靠性;DataNode 基於磁碟儲存 block,並儲存了 block 的校驗,從而保證 block 的可靠性;DataNode 和 NameNode 之間通過心跳保持,並向 NameNode 彙報 block 狀態。

三、常用的持久化方案

很多基於記憶體的儲存,在使用持久化時,持久化方案通常有幾種方案,包括日誌檔案、記憶體 Dump 和 兩種的混合方式。先來說一下比較常用的快取系統 —— Redis。Redis 的持久化方式分為 AOF、RDB 和 混合方式。Redis 的 AOF 屬於日誌 記錄 檔案,它會記錄每條命令到文字檔案中,RDB 屬於記憶體 Dump 的方式,它會全量的儲存記憶體的資訊,混合方式是 AOF 和 RDB 兩者共用的方式。(Redis 為了解決 AOF 體積的問題,提供了 AOF 重寫的命令)

四、HDFS 元資料的持久化

NameNode 基於記憶體儲存檔案元資料、目錄結構、檔案 block 的對映等資訊,為了保障其可靠性,需要對其進行持久化。 日誌檔案的方式 和 記憶體 Dump 都有其相應的優勢與劣勢,因此 HDFS 也使用了混合的方式。HDFS 同樣也同時使用了這兩種方式,其 日誌記錄 方式被稱為 EditsLog,其記憶體 Dump 方式被稱為 FsImage。因為 EditsLog 和 FsImage 也存在 日誌記錄 和 記憶體 Dump 的固有的缺點,因此兩種方式都使用,來彌補對方的缺點。

FsImage 嚴格來講算不上是一個 記憶體 Dump,因為 FsImage 的建立是在部署完 HDFS 後格式化時生成的。在 NameNode 第一次啟動時讀取的是一個空的 FsImage 檔案(當然,它可能有它的內部結構,但是此時它不包含元資料等資訊)。在之後的 NameNode 啟動時,會去讀 EditsLog 和 FsImage,此時會將所有的 EditsLog 中的記錄作用在記憶體中的 FsImage 上,並將新版本的 FsImage 從記憶體中儲存到磁碟上,然後刪除舊的 EditsLog 檔案。通過這種方式,HDFS 的記憶體中就得到了上次關機時的全量資料。

FsImage 需要滾動更新,FsImage 的滾動更新並非進行 記憶體 Dump,而是通過當前 FsImage 檔案和增量的 EditsLog 檔案形成新的 FsImage 檔案,然後將新的 FsImage 替換舊的 FsImage 檔案。而增量的 EditsLog 檔案則被刪除,重新記錄新的 EditsLog 檔案。

注意:NameNode 持久化不包含每個檔案的塊的位置,因為檔案塊的位置由 DataNode 主動進行上報。

五、Secondary NameNode 的引入

由於滾動更新 FsImage 檔案,也是比較耗時耗力的原因,HDFS 給 NameNode 提供了一個祕書,即 Secondary NameNode。Secondary NameNode 並非是第二個 NameNode,因為它不儲存元資料,它的作用是完成 FsImage 和 EditsLog 的合併。通常 Secondary NameNode 和 NameNode 不在同一主機。Secondary NameNode 通過 http get 方式獲取 NameNode 主機上的 FsImage 和 EditsLog,合併後通過 http post 方式提交給 NameNode,從而生成新的 FsImage 檔案。

當 Secondary NameNode 將 EditsLog 拉取以後,NameNode 會將將新的日誌記錄到新的 EditsLog 中。

六、總結

學習 HDFS 持久化時,想到了 Redis 的持久化,因為很多技術的實現不同,但是它們在理論上幾乎是相同的,或者是變通的。這裡通過類比的方式,感覺理解其他技術時就會容易一些。上面總結了 HDFS 的 主/從架構,即 NameNode 和 DataNode,其在 HA 模式下還有主備的概念,涉及到選主的一致性演算法等知識,之後再進行整理,希望喜歡的讀者可以給點贊、關注!

公眾號內回覆 【mongo】 下載 SpringBoot 整合操作 MongoDB 的文件。

之前整理的關於 Redis 的文章:

Redis | Redis 的安裝

Redis | Redis 的幫助命令

Redis | Redis 命令分類

Redis | Redis 通用命令

Redis | Redis 字串相關命令

Redis | Redis 列表相關命令

Redis | Redis 集合相關命令

Redis | Redis 有序集合相關命令

Redis | Redis 雜湊相關命令

Redis | 原始碼閱讀 —— 字串

Redis | 原始碼閱讀 —— 連結串列

Redis | Redis Pub/Sub相關命令

Redis | 管道 —— PipeLine

Redis | SpringBoot整合Redis

Redis | Redis 的事務一

Redis | Redis 的事務二

Redis | 基礎資料型別應用場景

Redis | 事務原始碼閱讀

Redis | 事物原始碼閱讀 —— watch

Redis | 慢查詢

Redis | 給介面新增快取

Redis | Redis 也會算距離