小工具知识网

当前位置: 首页 > 行业知识 > HDFS写入流程

行业知识

HDFS写入流程

2026-11-13 09:23:26 来源:互联网转载

1.hdfs Client 客户端调用DistributedFileSystem的creat()方法,这个方法会通过RPC远程过程调用的方式,调用NameNode的creat()方法

2.NameNode收到请求后:1)检测自己是否正常运行。2)判断要创建的文件是否存在。3)检查Client是否有创建文件的权限。4)以上通过后,NameNode会在HDFS文件系统创建一个空文件,并将这一操作记录在edits.log文件中。 如果以上有问题没通过,文件创建失败,NameNode会向客户端抛出异常。

如果NameNode的create()方法没有抛出异常,DistributedFileSystem的creat()方法会返回一个FSDataOutputStream输出流对象。

FSDataOutputStream out = fs.create(new Path("/root/test3.txt"));

3.客户端会调用输出流对象的write()方法,这个方法会通过RPC的方式调NameNode的addBlock()方法。向NameNode申请上传数据块(申请Block的写入节点列表)。

4.NameNode会返回给客户端一个LocatedBlock对象,这个对象包含的主要信息是这个这个block要存储在哪三个DataNode节点上。

5.客户端根据NameNode返回的位置信息,建立数据流管道pipeline。

6.然后客户端开始写数据。写过程有3层buffer,以chunk,packet,data queue三个粒度做三层缓存。

  • 输出流DFSOutputStream读取block数据,将数据写到chunk(512字节大小),当写满一个chunk后,会调用关于crc32的校验方法进行数据校验,生成一个4字节的checksum校验文件。然后将chunk和checksum共516字节,放进packet。
  • 当一个chunk和checksum放进入packet后,不会立即发送,而是累积到一个packet填满后,将这个packet放入dataQueue队列。
  • 进入dataQueue队列的packet会被另一线程按序取出沿着建立的管道发送到DataNode。传输的顺序是按NameNode的addBlock()方法返回的列表依次传输。

     dataQueue往DataNode传输的同时,也往确认队列ack queue传输作为备份。(ackQueue中存储的都是待确认的packet,如果数据包发出去之后流水线失败,得不到确认。数据包可以从ackQueue恢复,不至于以前的Packet丢失。)

    针对DataNode中传输完成的数据做一个checkSum,并与原本打包前的checkSum做一个比较。校验正确的结果 ACK 是反着 pipeline 方向 返回来的,DataNode3--->DataNode2-->DataNode1。每个 DataNode 传输情况都正常,ACK 才能返回给客户端,DFSOutputStream会有一个ResponseProcessor线程用来接收ACK。如果收到成功的ACK,ResponseProcessor线程会将确认队列ackQueue中删除对应的package,如果写入失败,会将ackQueue里的package置入 data Queue重传。

    当该block的所有package发送完毕。即DataNode1、DataNode2和DataNode3都存在该block的完整副本,则三个DataNode分别调用NameNode的 blockReceivedAndDeleted方法。NameNode会更新内存中DataNode和block的关系。Client客户端关闭同DataNode建立的pipeline。

    7.如果这个文件还有其它的块 block,则重新执行上面的 3-6 步骤,直到文件传输完成。

    8.全部数据输出完成,关闭数据流调用FSDataOutputStream的 close 方法。

    9.客户端调用NameNode的 complete 方法,通知NameNode全部数据输出完成。

    纯属于个人通过搜索资料整理备忘,如有侵权,请联系删除!

    参考资料:

    太强了,HDFS写入流程原理_hdfs 本地 直接 写-CSDN博客

    带你入坑大数据(二) --- HDFS的读写流程和一些重要策略 - 掘金

    HDFS读写流程分析+源码解读_hdfs数据读写过程代码-CSDN博客

    API实现HDFS的读写数据流JAVA代码及流程详解_完成程序填空,使用字符流读取数据将hdfs中指定文件输出到指定文件中-CSDN博客关于HDFS的 block、packet与chunk详解 - 程序员大本营

    HDFS写流程源码分析(一)-客户端_hdfs代码分析-CSDN博客

    简单之美 | HDFS 写文件过程分析

    https://www.cnblogs.com/jimmy888/p/13562676.html

    大数据-HDFS工作机制_在流式复制(pipeline)时如果有一台或两台(不是全部)没有复制成功,不影响最后-CSDN博客

    HDFS写流程源码分析(二)-NameNode服务端_hdfs源代码-CSDN博客

    【HDFS】读数据流程分析_hadoop数据的读取过程代码分析-CSDN博客

    Hadoop架构: 流水线(PipeLine)_hadoop pipeiline-CSDN博客

    2021-12-23 hadoop3 写数据流程(三):DataStreamer_dfsstripedoutputstream-CSDN博客

上一篇:Gateway网关拦截器的ServerWebExchange

下一篇:传奇服务器端怎么下载?