hadoop3.x:HDFS 写流程、Pipeline管道、ACK应答 作者:马育民 • 2021-04-01 15:37 • 阅读:10685 # 写流程 [](https://www.malaoshi.top/upload/pic/hadoop/QQ20211101182558.png) 1. client通过 `FileSystem.create()` 向 NameNode 请求上传文件,NameNode **检查文件是否存在**、**父目录是否存在**、**是否拥有创建权限等** 2. NameNode返回是否可以上传。 3. 客户端请求第一个 Block上传到哪几个DataNode服务器上。 4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。 5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。 6. dn1、dn2、dn3逐级应答客户端。 7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet,一般写入文件,一般传给dn2,dn2传给dn3;**dn1每传一个packet会放入一个应答队列等待应答**。 8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。 # Pipeline管道 Pipeline,管道,是HDFS在上传文件写数据过程中采用的一种数据传输方式。 客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。 [](https://www.malaoshi.top/upload/pic/hadoop/QQ20211101155841.png) ### 为什么datanode采用pipeline线性传输,而不是一次给三个datanode传输? 因为数据以管道的方式,顺序的沿着一个方向传输,这样能够 **充分利用每个机器的带宽**,**避免网络瓶颈** 和 **高延迟时的连接**,最小化推送所有数据的延时。 在线性推送模式下,每台机器所有的出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带(局域网) # ACK应答响应 ACK (Acknowledge character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。 在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全。 [](https://www.malaoshi.top/upload/pic/hadoop/QQ20211101161328.png) 原文出处:http://malaoshi.top/show_1IX29Fc7gVjg.html