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生态的核心计算与存储基础。