HDFS写数据流程

在这里插入图片描述

大致步骤

  ①服务端启动HDFS中的NN和DN进程

  ②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件

  ③NN处理请求,检查客户端是否有权限上传,路径是否合法等

  ④检查通过,NN响应客户端可以上传

  ⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回

  ⑥客户端根据返回的DN节点,请求建立传输通道
  客户端向最近(网络距离最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)
  下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

  ⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点
  通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!
  每个节点在收到packet后,向客户端发送ack确认消息!

  ⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块

  ⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!
    客户端关闭输出流

详细步骤

  只有namenode是处理客户端请求的,所以上传文件的请求要发给namenode。

请求发过来之后,namenode会首先处理上传请求
  1.检查请求是否有权限上传
  2.检查要上传的文件目的路径是否已经存在,如果存在,那么在上传时如果没有传overwrite=true这个参数,说明文件是不覆盖的,那么这个文件已经存在,所以就不能再上传。

  如果上面两个条件都没有问题,那么这时候namenode就会给客户端一个响应,告诉客户端可以上传这个文件。

文件是以block的形式存放到hdfs上。

  所以第一步,需要对那个200M的文件先开始读取第一个块,(块的大小是由客户端指定)。请求上传第一个block的内容,请求返回DataNode(返回DataNode的数量跟集群数量保持一致,因为要存放副本)请求上传时,最终是由DataNode帮我们把数据存储到机器的磁盘上,所以namenode需要告诉客户端哪些DataNode是可以帮客户端做存储工作。

  namenode返回三个DataNode节点给客户端,表示这三个结点存储数据。

  写数据时,客户端会先将数据写到其中一个DataNode中,再由这个DataNode将数据传送给其他两个DataNode,这样客户端只用一次写操作就可以将数据写入三个DataNode。

具体实现步骤:

  客户端请求和第一个DataNode1节点建立block传输通道,由DataNode1节点再向距离它最近的节点DataNode2请求建立通道,DataNode3同理。
  请求完之后就由DataNode3向DataNode2进行回应,依次类推。由DataNode1向客户端回应整个通道建立完成。

  接下来客户端向DataNode发送数据,以Packet(一个小包64k)形式发送,小包里面由若干的chunk(小块,一个小块是512B+4B(四位校验和))组成,DataNode收到小包之后就写入磁盘。
  每个DataNode,每收到小包之后都会向客户端回复确认消息。当一个block传输完成之后,通道就会关闭,紧接着DataNode向namenode向发送消息,告诉namenode它当前已经收完了一个block。

  之后就开始第二个block的发送,跟第一个block的传输流程一样。直到最后一个块也发送完毕,namenode向客户端发送响应,告诉客户端数据传输完成。客户端接收到响应之后关闭输出流。

异常写流程

  ①-⑥见上

  ⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQueue(待发送数据包)

   在发送时,先将dataQueue中的packet按顺序发送,发送后再放入到ackqueue(正在发送的队列)。

  每个节点在收到packet后,向客户端发送ack确认消息!

  如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackqueue中删除!

  假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackqueue中的packet会回滚到dataQueue。

  重新建立通道,剔除坏的DN节点(如果跟某个DataNode建立不了通道,那么就会跳过这个节点,跟下一个节点建立通道)。建立完成之后,继续传输!

  只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!(只不过这个块是不满足副本数的)
  NN会自动维护副本数!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值