HDFS的读写流程是怎样的
导读:HDFS写数据流程 客户端发起写入请求:客户端通过FileSystem.create( 方法向NameNode发送创建文件的RPC请求,请求中包含目标文件路径、父目录等信息。 NameNode检查元数据:NameNode验证目标文件是否已...
HDFS写数据流程
- 客户端发起写入请求:客户端通过
FileSystem.create()方法向NameNode发送创建文件的RPC请求,请求中包含目标文件路径、父目录等信息。 - NameNode检查元数据:NameNode验证目标文件是否已存在、客户端是否有写入权限、父目录是否存在。若检查不通过(如文件已存在),则抛出异常;若通过,NameNode在元数据中创建空文件记录。
- NameNode分配DataNode:NameNode根据副本放置策略(默认3副本)选择DataNode列表:第一副本优先写入客户端所在节点(若客户端不在集群,则随机选择);第二副本放在与第一副本不同机架的节点(提高容错能力);第三副本放在与第二副本同一机架的另一节点(平衡存储与网络开销)。返回排序后的DataNode列表(如DN1、DN2、DN3)给客户端。
- 建立数据写入管道:客户端与DN1建立连接,DN1再连接DN2,DN2连接DN3,形成“客户端→DN1→DN2→DN3”的数据传输管道。数据以Packet(默认64KB)为单位缓存并传输。
- 数据分块传输与ACK确认:客户端将数据分割为Packet,依次发送给DN1;DN1存储后转发给DN2,DN2转发给DN3。每个DataNode存储成功后,向上游节点发送ACK确认;客户端收到所有DataNode的ACK后,才认为该Packet写入成功。当一个数据块(默认128MB)写满后,DataNode向NameNode发送Block Report(汇报块信息),并等待新的写入指令。
- 完成文件写入:客户端完成所有数据块写入后,调用
close()方法关闭流。NameNode确认所有块的Block Report都已接收,更新元数据(如文件大小、块列表、副本位置),完成文件写入。
HDFS读数据流程
- 客户端发起读取请求:客户端通过
FileSystem.open()方法向NameNode发送读取文件的RPC请求,请求中包含目标文件路径。 - NameNode返回元数据:NameNode检查文件是否存在,返回文件元数据:块列表(每个块的大小、编号)、副本位置(每个块所在的DataNode地址,按网络拓扑排序,优先返回离客户端最近的节点,如同一机架或同一节点)。
- 客户端连接DataNode读取数据:客户端根据NameNode返回的DataNode列表,选择最近的DataNode建立Socket连接。DataNode以Packet为单位将数据块传输给客户端,客户端按顺序接收并缓存。
- 容错机制(读取失败处理):若某个DataNode读取失败(如网络中断、节点宕机),客户端自动切换到下一个副本对应的DataNode继续读取。若所有副本均不可用,客户端向NameNode报告,NameNode可能触发数据恢复机制(如从其他健康副本复制)。
- 合并数据块并关闭流:客户端将接收到的所有数据块按顺序合并成完整文件。读取完成后,调用
close()方法关闭输入流,释放资源。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: HDFS的读写流程是怎样的
本文地址: https://pptw.com/jishu/738077.html
