HDFS的读写流程——宏观与微观
作者:互联网
HDFS的读写流程——宏观与微观
HDFS:分布式文件系统,负责存放数据
分布式文件系统:就是将我们的数据放到多台电脑上存储。
写数据:就是将客户端上的数据上传到HDFS
宏观过程
-
客户端向HDFS发送读写数据请求
hdfs dfs -put student.txt /shujia/ 客户端发送命令将student.txt文件上传到/shujia/目录下
-
Filesystem通过rpc调用namenode的put方法
- NN(NameNode)首先检查是否有足够的空间权限等条件来创建这个文件,或者这个路径是否已经存在,有权限会针对这个文件创建一个空的Entry对象,并提示返回成功状态给DFS。没有权限会直接抛出对应的异常,给与客户端错误提示信息
-
如果DFS接收到成功的状态,会创建一个FSDataOutputStream的对象给客户端使用
-
客户端要向NN询问第一个Block块存放的位置(通过机架感知策略)
-
需要将客户端与DN(DataNode)节点通过管道(pipeline)的方式建立连接,DN节点之间也是通过这种方式连接
-
客户端会按照块对文件进行切分,但是按照packet的方式来发送数据。默认一个packet的大小是64K,一个块128M就有2048个packet
-
客户端通过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
-
如果客户端接收到成功的状态,说明这个packet发送成功了。客户端会一直发送,直到当前块的所有packet发完。
-
如果客户端接收到最后一个packet的成功状态,说明当前block块传输完成,管道就会撤销,客户端会将这个传递完成的消息给NN,然后询问NN第二个块的存放位置,依次类推。
-
当所有的block块传输完成后,NN在Entry中存储的所有File与Block与DN的映射关系都会关闭。
注意:客户端与要存放block块的DN节点进行连接,然后DN与它的副本节点建立管道连接。DataNode中的节点是可以相互通信的,也就是说客户端在DN1上保存block0,然后在DN4、DN6上保存这个块的副本。那么管道连接就是 客户端-->DN1-->DN4-->DN6(双向箭头,这里打不出来)
流程图
微观过程
在说微观过程之前我们要考虑两个问题:一是客户端怎么知道packet传输完毕的,二是如果在传输过程中packet丢了,例如断电怎么办。
那么如何保证packet发送的工程中不出错呢
-
客户端首先将自己的数据以流的方式读取到缓存中
-
然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet中(64K)
- chunk:checksum=128:1
- checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
- packet中的数据分为两类:一类是实际数据包,一类是header包
-
一个数据包的组成结构
offsetInBlock:packet在block中的偏移量
LastPacketInBlock:是否是一个Block块的最后一个packet,通过这个参数就可以解决前面的第一个问题
-
我们生成packet的速度肯定比我们将packet发送到DN上的速度要快,那么客户端就会产生很多的packet包,这时客户端会将多余的packet放入缓冲队列DataQueue。然后调用FSDataOutputStream的对象从缓冲队列调取packet写入DN。在取出的时候会将packet复制一份放入AckQueue,这类似于另一个缓冲队列。当客户端接收到packet写入完成的信息后(ack=true)会删除AckQueue缓冲区的对应packet。这样即使断电,正在传输中的packet丢失,由于AckQueue中对应的packet没有删除,说明这个packet没有传输成功,就会重新传输这个包,这样就解决了我们前面提到的第二个问题。
读数据
前面的都是从客户端往DN写数据,现在讨论读数据的过程
- 首先客户端发送请求到DFS,申请读某一个文件
- DFS去NN查找这个文件的元数据信息
- DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
- 客户端获取文件的第一个block块信息,返回DN1 DN2 DN4
- 客户端直接就近原则选择存放块的DN1
- 依次类推其他block块的信息,知道最后一个块,将所有的block块合并成一个文件
- 关闭FSDataInputStream
流程图
标签:DN,HDFS,ack,读写,packet,node1,微观,block,客户端 来源: https://www.cnblogs.com/bfy0221/p/16615234.html