一、核心角色说明角色职责Client客户端发起读写请求与 NameNode 交互获取元数据直接与 DataNode 传输数据NameNode管理文件系统命名空间和元数据文件→Block映射、Block位置不存储实际数据DataNode存储实际的数据块Block执行读写操作定期向 NameNode 汇报心跳和块报告二、HDFS 写数据流程7步详解客户端 → NameNode → DataNode(Pipeline) → ACK确认 → 完成详细步骤客户端初始化创建DistributedFileSystem对象调用create()方法请求 NameNode 创建文件NameNode 权限校验NameNode 检查文件是否已存在、父目录是否存在、客户端是否有写权限。校验通过后在元数据中创建文件记录返回FSDataOutputStream输出流数据分块与队列客户端写入数据时DFSOutputStream将数据切分为Packet默认64KB放入内部数据队列data queuePipeline 管道传输核心DataStreamer请求 NameNode 分配一组 DataNode默认3副本数据按Pipeline 方式传输Client → DN1 → DN2 → DN3每个 DataNode 接收数据后存储并转发给下一个节点形成流水线ACK 确认机制DFSOutputStream维护一个ack queue只有收到 Pipeline 中所有 DataNode 的确认回执该 Packet 才会从队列中移除客户端关闭流数据写入完成后调用close()方法关闭FSDataOutputStream通知 NameNode 完成DistributedFileSystem通知 NameNode 文件写入完成NameNode 确认最小副本数dfs.namenode.replication.min默认1成功后即可返回副本放置策略机架感知 Rack AwarenessHDFS 采用智能副本放置策略优化性能和可靠性第1副本客户端所在节点若客户端是DataNode否则随机选一个负载较低的节点第2副本与第1副本 **不同机架** 的节点防止单机架故障第3副本与第2副本 **相同机架** 的不同节点平衡网络开销与可靠性✅ 优势既保证跨机架容错又减少跨机架网络传输开销三、HDFS 读数据流程6步详解客户端 → NameNode(获取Block位置) → DataNode(就近读取) → 数据整合 → 返回用户详细步骤客户端发起读请求创建DistributedFileSystem调用open()方法打开目标文件NameNode 返回 Block 位置NameNode 通过 RPC 返回文件中前几个 Block 的位置信息分批次获取避免内存压力返回的 DataNode 地址列表按网络拓扑距离排序离客户端近的排前面获取输入流DistributedFileSystem返回FSDataInputStream内部封装DFSInputStream给客户端客户端直连 DataNode 读取客户端调用read()方法DFSInputStream自动连接距离最近的 DataNode读取第一个 Block数据以流的方式返回客户端自动切换 Block当前 Block 读完DFSInputStream自动关闭连接寻找下一个 Block 的最优 DataNode。对用户透明感觉像在读取连续文件读取完成关闭流客户端调用close()方法释放资源读取优化策略就近读取优先从与客户端同机架的 DataNode 读取减少网络延迟故障自动切换若某个 DataNode 读取失败自动尝试其他副本节点腾讯数据校验读取时通过 CRC32 校验和验证数据完整性损坏则自动从其他副本恢复四、关键机制图解【写流程 Pipeline 示意】 Client │ ▼ [Packet] → DN1(写转发) → DN2(写转发) → DN3(写) │ │ │ │ └──── ACK ←┴────── ACK ←──┴────── ACK ←──┘ 全部确认后 Packet 才从 ack queue 移除 【读流程拓扑优化】 Client │ ▼ NameNode: 返回 [DN-A(同机架), DN-B(同机架), DN-C(跨机架)] │ ▼ 优先连接 DN-A 读取 → 失败则自动切换 DN-B → 再失败切换 DN-C