Hadoop 2.0x:HDFS写入数据宏观和微观流程

HDFS写数据流程

宏观流程


图解

在这里插入图片描述

描述

  • 写数据就是将客户端的数据上传到HDFS

流程

  • 1、 客户端向HDFS发送写数据请求

    • hdfs dfs -put user.txt /data/
  • 2、 filesystem通过rpc远程调用namenode的create方法

    • NN 会检查要创建的文件是否已经存在,创建者是否有权限进行操作。权限

      • 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
      • 没有:直接抛出对应的异常,给予客户端错误提示信息
  • 3、 DFS如果接收到成功状态,会创建一个对象 FSDataOutputStream的对象给客户端使用

  • 4、客户端需要向NN询问第一个Block存放的位置

    • NN通过机架感知策略 (node1 node 2 node8)
  • 5、需要将客户端和DN节点创建连接

    • 通过 pipeline(管道)

      • 客户端和node1创建连接 socket
      • node1和node2创建连接 socket
      • node2 和Node8创建连接 socket
  • 6、 客户端将文件按照块block切分数据,但是按照packet发送数据

    • 默认一个packet大小为64K,Block128M为2048个packet
  • 7、 客户端通过pipeline管道开始使用FSDataOutputStream对象将数据输出。把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式

    • 1、客户端首先将一个packet发送给node1,同时给予node1一个ack状态
    • 2、node1接受数据后会将数据继续传递给node2,同时给予node2一个ack状态
    • 3、node2接受数据后会将数据继续传递给node8,同时给予node8一个ack状态
    • 4、node8将这个packet接受完成后,会响应这个ack给node2为true
    • 5、 node2会响应给node1 ,同理node1响应给客户端
  • 8、客户端接收到成功的状态,就认为某个packet发送成功了,直到当前块所有的packet都发送完成

  • 9、如果客户端接收到最后一个pakcet的成功状态,说明当前block传输完成,管道就会被撤销

  • 10、 客户端会将这个消息传递给NN,NN确认传输完成

    • 1、 NN会将block的信息记录到Entry,客户端会继续向NN询问第二个块的存储位置,依次类推
    • 2、block1 (node1 node2 node8)
    • 3、 block2 (node1 node8 node9)
    • 4、…
    • 5、blockn(node1 node7 node9)
  • 11、、如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。

  • 12、当所有的block传输完成后,NN在Entry中存储所有的File与Block与DN的映射关系关闭FsDataOutPutStream

微观流程


在这里插入图片描述

流程

  • 1、首先客户端从自己的硬盘以流的方式读取数据文件到自己的缓存中

  • 2、然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64K)

    • 注意

      • 1、chunk:checksum=128:1
      • 2、checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
      • 3、Packet中的数据分为两类,一类是实际数据包,另一类是header包。
      • 4、一个Packet数据包的组成结构
        在这里插入图片描述
  • 3、当packet满的时候加入到 添加到 dataqueue

  • 4、 datastreamer开始从dataqueue队列上取出一个packet,通过FSDataOPS发送到Pipleline

    • 在取出的时候,也会将packet加入到ackQueue,典型的生产者消费者模式
  • 5、客户端发送一个Packet数据包以后开始接收ack,会有一个用来接收ack的ResponseProcessor进程,如果收到成功的ack

    • 1、如果某一个packet的ack为true,那么就从ackqueue删除掉这个packet
    • 2、如果某一个packet的ack为false,将ackqueue中所有的packet重新挂载到 发送队列,重新发送
  • 6、最终DFS保存的数据格式为
    在这里插入图片描述

    • 注意

      • 最后Packet Header 这些描述信息不要,只保留Packet Data
      • 最终所有 ChunkChecksum 写在一起,组成了 meta
      • 所有ChunkData 组成了 block

底线。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寧三一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值