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

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

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:26cd2cc3-9c5b-4575-99fe-99012d7c5a27

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:48823fad-916b-46f4-be06-7b83a22092e6

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

宏观过程

  1. 客户端向HDFS发送读写数据请求
hdfs dfs -put student.txt /shujia/ 客户端发送命令将student.txt文件上传到/shujia/目录下
  1. Filesystem通过rpc调用namenode的put方法
  2. 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对象将数据输出
  8. 客户端首先将一个packet包发送给node1,同时给予node1一个ack状态
  9. node1接收数据后会将数据继续传递给node2,同时给与node2一个ack状态
  10. 同理,node2会传给node3,同时给node3一个ack状态
  11. node3将这个packet接收完成后会响应这个ack状态,给node2说我的状态为true。
  12. node2会响应node1,node2的ack状态为true。
  13. node1会响应客户端,node1的ack状态为true
  14. 如果客户端接收到成功的状态,说明这个packet发送成功了。客户端会一直发送,直到当前块的所有packet发完。
  15. 如果客户端接收到最后一个packet的成功状态,说明当前block块传输完成,管道就会撤销,客户端会将这个传递完成的消息给NN,然后询问NN第二个块的存放位置,依次类推。
  16. 当所有的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)
  3. chunk:checksum=128:1
  4. checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
  5. packet中的数据分为两类:一类是实际数据包,一类是header包
    HDFS的读写流程——宏观与微观
    HDFS的读写流程——宏观与微观

读数据

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

  • 首先客户端发送请求到DFS,申请读某一个文件
  • DFS去NN查找这个文件的元数据信息
  • DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
  • 客户端获取文件的第一个block块信息,返回DN1 DN2 DN4
  • 客户端直接就近原则选择存放块的DN1
  • 依次类推其他block块的信息,知道最后一个块,将所有的block块合并成一个文件
  • *关闭FSDataInputStream

流程图

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

Original: https://www.cnblogs.com/bfy0221/p/16615234.html
Author: 伍点
Title: HDFS的读写流程——宏观与微观

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/562064/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球