Hadoop在Linux中的數據存儲機制
Hadoop在Linux環境中的數據存儲核心依賴Hadoop分布式文件系統(HDFS),這是一種面向海量數據的分布式存儲系統,通過分塊存儲、副本機制、主從架構等設計,實現數據的高可靠、高吞吐和高擴展性。
一、HDFS核心組件及職責
HDFS采用Master/Slave(主從)架構,主要由以下組件構成:
- NameNode(主節點):HDFS的“大腦”,負責管理文件系統的元數據(包括目錄結構、文件名、文件屬性(生成時間、權限)、數據塊與DataNode的映射關系等)。它處理客戶端的讀寫請求,協調數據塊的分配與復制。
- DataNode(從節點):HDFS的“工作者”,負責實際存儲數據塊(Block)。它們執行NameNode的指令(如創建、刪除、復制數據塊),并定期向NameNode發送心跳信號(報告存活狀態)和塊報告(匯報存儲的塊信息)。
- Secondary NameNode(輔助節點):并非NameNode的熱備,其主要職責是定期合并NameNode的元數據(將編輯日志
edits log
合并到文件系統鏡像fsimage
中),防止編輯日志過大導致NameNode重啟緩慢;在NameNode故障時,可用于輔助恢復元數據。
二、數據存儲流程
1. 寫入數據流程
客戶端向HDFS寫入數據時,遵循以下步驟:
- 發起請求:客戶端通過HDFS API向NameNode發送文件上傳請求;
- 元數據檢查:NameNode驗證文件是否已存在、父目錄是否有效;
- 分配存儲位置:NameNode根據機架感知策略(Rack Awareness),選擇不同機架上的3個DataNode(默認副本數為3),返回給客戶端;
- 數據傳輸:客戶端將文件按固定大小分塊(默認128MB),依次通過FSDataOutputStream將數據塊寫入第一個DataNode;該DataNode接收到數據后,立即復制到后續DataNode(逐級傳輸),形成“流水線”寫入模式;
- 確認完成:所有DataNode寫入成功后,向NameNode發送確認;NameNode更新元數據,標記文件存儲完成。
2. 讀取數據流程
客戶端從HDFS讀取數據時,流程如下:
- 定位塊位置:客戶端向NameNode發送文件讀取請求,NameNode返回數據塊的位置列表(按就近原則排序,優先選擇同一機架或本地的DataNode);
- 并行讀取:客戶端直接從列表中的第一個DataNode讀取數據塊;若該副本不可用(如節點故障),自動切換到下一個副本;
- 數據重組:客戶端將讀取到的所有數據塊按順序拼接,還原為原始文件。
三、關鍵存儲機制
1. 數據分塊(Block)
HDFS將大文件分割為固定大小的數據塊(默認128MB,可通過dfs.blocksize
參數調整),這種設計的好處是:
- 提高并行處理能力(多個數據塊可同時被不同節點處理);
- 減少小文件問題(小文件可合并存儲,降低NameNode元數據壓力);
- 適配分布式存儲(數據塊可分散存儲在不同節點,提高吞吐量)。
2. 副本機制(Replication)
為保證數據可靠性,HDFS為每個數據塊存儲多個副本(默認3個),副本的存放遵循機架感知策略:
- 第一個副本:存儲在客戶端所在節點(若客戶端在集群外,則隨機選擇一個節點);
- 第二個副本:存儲在與第一個副本不同機架的節點上;
- 第三個副本:存儲在與第二個副本同一機架的不同節點上。
這種策略既保證了數據的冗余性(單節點或機架故障不會導致數據丟失),又提高了讀取效率(優先從本地或同機架讀?。?。
3. 元數據管理
NameNode通過命名空間(Namespace)維護文件系統的邏輯結構(目錄樹、文件屬性),并通過映射表記錄每個數據塊與DataNode的對應關系。元數據的變更(如文件創建、刪除)會記錄到編輯日志(edits log)中,而文件系統的完整鏡像則保存為fsimage文件。Secondary NameNode定期合并這兩個文件,防止編輯日志過大。
四、數據可靠性保障
- 副本機制:默認3副本策略,確保單節點或機架故障時數據仍可訪問;
- 心跳檢測:DataNode定期向NameNode發送心跳(默認3秒一次),若NameNode超過10分鐘未收到心跳,則認為該節點失效,立即啟動副本恢復流程(在其他健康節點上復制副本);
- 數據校驗:讀取數據時,客戶端可驗證數據塊的校驗和(Checksum),若校驗失敗,自動從其他副本讀取,確保數據完整性。