HDFS存儲原理
1. 架構設計
- 主從架構:包含一個NameNode(主節點)和多個DataNode(從節點)。
- NameNode:管理元數據(文件目錄結構、文件塊映射、塊位置信息),不存儲實際數據。
- DataNode:存儲實際數據塊,負責處理客戶端的讀寫請求,并定期向NameNode發送心跳和塊報告。
2. 數據分塊與副本機制
- 分塊存儲:文件被分割為固定大小的塊(默認128MB或256MB),便于并行處理和存儲優化。
- 多副本冗余:每個塊默認保存3個副本,分布策略為:
- 第1個副本:寫入客戶端所在節點(若為集群外則隨機選節點)。
- 第2個副本:同一機架的另一節點。
- 第3個副本:不同機架的節點。
- 容錯性:通過副本機制和機架感知策略,保障數據可靠性與讀取效率。
3. 讀寫流程
-
寫入流程:
- 客戶端向NameNode申請寫入,NameNode分配DataNode列表。
- 客戶端將數據塊寫入第一個DataNode,后者通過管道依次復制到其他副本節點。
- 寫入成功后,NameNode更新元數據。
-
讀取流程:
- 客戶端向NameNode獲取文件塊的位置信息。
- 直接從最近的DataNode(基于網絡拓撲)讀取數據塊,支持并發讀取多個塊。
4. 容錯與高可用
- DataNode故障:NameNode通過心跳檢測移除失效節點,并觸發副本復制。
- NameNode HA(Hadoop 2.x+):通過主備NameNode和JournalNode實現故障自動切換,解決單點問題。
MapReduce計算模型
1. 核心階段
-
Map階段:
- 輸入數據被劃分為分片(Split),每個分片由一個Map任務處理。
- Map任務輸出中間鍵值對(Key-Value),可本地聚合(Combiner)減少數據傳輸。
-
Shuffle與Sort階段:
- 分區(Partitioning):按Key的哈希值分配到不同Reduce任務。
- 排序與合并:Map端對輸出排序,Reduce端合并相同Key的數據。
-
Reduce階段:
- 對Shuffle后的數據執行用戶定義的Reduce邏輯,生成最終結果。
2. 執行流程
- 作業提交:客戶端提交任務到ResourceManager(YARN架構)。
- 任務調度:ApplicationMaster分配Map/Reduce任務到NodeManager。
- 數據本地化優化:優先調度Map任務到存儲數據的節點,減少網絡IO。
- 結果輸出:Reduce結果寫入HDFS或其他存儲系統。
3. 容錯機制
- 任務重試:失敗的Map/Reduce任務會被重新調度到其他節點。
- 推測執行:對慢節點啟動備份任務,防止個別任務拖慢整體進度。
4. 適用場景
- 離線批處理:適合大規模數據并行計算(如日志分析、ETL)。
- 局限性:不適合低延遲(實時)場景,迭代計算效率較低(需多次讀寫HDFS)。
總結
- HDFS:通過分塊、多副本和機架感知實現高吞吐、高可靠存儲。
- MapReduce:以分而治之思想,通過Map、Shuffle/Sort、Reduce三階段處理海量數據,結合容錯機制保障穩定性。兩者共同構成Hadoop生態的核心計算與存儲基礎。