HDFS写入数据流程可分为以下核心步骤,综合多个技术文档整理而成:
一、客户端初始化阶段
连接建立与请求提交:客户端通过DistributedFileSystem对象向NameNode发起上传请求,携带文件路径、权限等信息;
NameNode预检:NameNode检查目标文件是否存在、父目录合法性及用户权限,通过后生成操作日志(EditLog)并返回可上传响应;
二、数据分块与管道建立
数据块划分:客户端按默认128MB块大小划分文件(可自定义配置),依次处理每个块;
DataNode列表获取:客户端向NameNode请求当前块的存储节点,NameNode基于机架感知策略(优先同机架节点)和负载均衡返回3个DataNode地址;
传输管道构建:客户端与第一个DataNode建立连接,后续节点通过逐级调用形成传输链(如dn1→dn2→dn3),完成后逐级返回应答确认管道就绪;
三、数据写入阶段
Packet传输机制:数据按64KB的Packet单位拆分,加入客户端内部队列(dataQueue);
DataStreamer线程异步从队列获取Packet,通过管道发送至dn1;各DataNode接收Packet后写入本地磁盘,并转发给下一节点;
ACK确认机制:每个Packet传输完成后,DataNode通过反向管道返回ACK确认,客户端将Packet移入ackQueue;若传输失败,触发重传机制;
四、收尾与元数据更新
块传输完成通知:当一个Block全部数据传输完成后,客户端通知NameNode记录元数据信息;
循环处理与文件关闭:重复步骤3–8处理后续Block,最终关闭输出流并提交完整文件状态至NameNode。
关键配置与优化:副本策略:默认副本数3,可通过客户端配置调整;
小文件合并:通过hdfs.rollSize等参数控制文件滚动生成,减少NameNode内存压力。
该流程通过管道化传输和异步确认机制实现高效写入,同时依赖NameNode的元数据管理保障数据一致性。