其他分享
首页 > 其他分享> > HDFS的读写流程——宏观与微观

HDFS的读写流程——宏观与微观

作者:互联网

HDFS的读写流程——宏观与微观

HDFS:分布式文件系统,负责存放数据

分布式文件系统:就是将我们的数据放到多台电脑上存储。

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

宏观过程

  1. 客户端向HDFS发送读写数据请求

    hdfs dfs -put student.txt /shujia/ 客户端发送命令将student.txt文件上传到/shujia/目录下
    
  2. Filesystem通过rpc调用namenode的put方法

    • NN(NameNode)首先检查是否有足够的空间权限等条件来创建这个文件,或者这个路径是否已经存在,有权限会针对这个文件创建一个空的Entry对象,并提示返回成功状态给DFS。没有权限会直接抛出对应的异常,给与客户端错误提示信息
  3. 如果DFS接收到成功的状态,会创建一个FSDataOutputStream的对象给客户端使用

  4. 客户端要向NN询问第一个Block块存放的位置(通过机架感知策略)

  5. 需要将客户端与DN(DataNode)节点通过管道(pipeline)的方式建立连接,DN节点之间也是通过这种方式连接

  6. 客户端会按照块对文件进行切分,但是按照packet的方式来发送数据。默认一个packet的大小是64K,一个块128M就有2048个packet

  7. 客户端通过pipeline管道使用FDSOutputStream对象将数据输出

    • 客户端首先将一个packet包发送给node1,同时给予node1一个ack状态
    • node1接收数据后会将数据继续传递给node2,同时给与node2一个ack状态
    • 同理,node2会传给node3,同时给node3一个ack状态
    • node3将这个packet接收完成后会响应这个ack状态,给node2说我的状态为true。
    • node2会响应node1,node2的ack状态为true。
    • node1会响应客户端,node1的ack状态为true
  8. 如果客户端接收到成功的状态,说明这个packet发送成功了。客户端会一直发送,直到当前块的所有packet发完。

  9. 如果客户端接收到最后一个packet的成功状态,说明当前block块传输完成,管道就会撤销,客户端会将这个传递完成的消息给NN,然后询问NN第二个块的存放位置,依次类推。

  10. 当所有的block块传输完成后,NN在Entry中存储的所有File与Block与DN的映射关系都会关闭。

注意:客户端与要存放block块的DN节点进行连接,然后DN与它的副本节点建立管道连接。DataNode中的节点是可以相互通信的,也就是说客户端在DN1上保存block0,然后在DN4、DN6上保存这个块的副本。那么管道连接就是 客户端-->DN1-->DN4-->DN6(双向箭头,这里打不出来)

流程图

hdfs的宏观的写流程图

微观过程

在说微观过程之前我们要考虑两个问题:一是客户端怎么知道packet传输完毕的,二是如果在传输过程中packet丢了,例如断电怎么办。

那么如何保证packet发送的工程中不出错呢

  1. 客户端首先将自己的数据以流的方式读取到缓存中

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

    • chunk:checksum=128:1
    • checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
    • packet中的数据分为两类:一类是实际数据包,一类是header包
  3. 一个数据包的组成结构

    image-20220523222659558

    offsetInBlock:packet在block中的偏移量

    LastPacketInBlock:是否是一个Block块的最后一个packet,通过这个参数就可以解决前面的第一个问题

  4. 我们生成packet的速度肯定比我们将packet发送到DN上的速度要快,那么客户端就会产生很多的packet包,这时客户端会将多余的packet放入缓冲队列DataQueue。然后调用FSDataOutputStream的对象从缓冲队列调取packet写入DN。在取出的时候会将packet复制一份放入AckQueue,这类似于另一个缓冲队列。当客户端接收到packet写入完成的信息后(ack=true)会删除AckQueue缓冲区的对应packet。这样即使断电,正在传输中的packet丢失,由于AckQueue中对应的packet没有删除,说明这个packet没有传输成功,就会重新传输这个包,这样就解决了我们前面提到的第二个问题。

    HDFS写流程微观角度

读数据

前面的都是从客户端往DN写数据,现在讨论读数据的过程

流程图

HDFS读流程

标签:DN,HDFS,ack,读写,packet,node1,微观,block,客户端
来源: https://www.cnblogs.com/bfy0221/p/16615234.html