闲暇之余,梳理了一下HDFS的读、写数据流程。
(一)下图是HDFS读数据流程图:
HDFS读数据流程.png- 1、客户端向NameNode建立通信发送请求读取某文件,例如:读取/aa/...txt文件。
- 2、NameNode获取文件的元数据信息(名称空间、block块信息,副本数量),并将目标文件的元信息返回给客户端。
在这里:
①文件名为/aa/...txt,
②每个数据块有3个副本,
③共有BLK_1、BLK_2、BLK_3三个数据块组成,
④BLK_1存储在DN1、DN3、DN4节点上,BLK_2存储在DN1、DN4、DN5节点上,BLK_3存储在DN2、DN3、DN5节点上。
- 3、客户端选择其中的一个节点(如图去DN1上)去请求读取BLK_1。
这里选择节点遵循就近原则,然后随机。
- 4、DN1将BLK_1数据传输给客户端。
- 5、客户端继续选择其中一个节点(如图DN4上)去请求读取BLK_2。
- 6、DN4将BLK_2数据传输给客户端,客户端将BLK_2数据追加到BLK_1数据后面,这里有个追加的过程。
- 7、客户端继续选择其中一个节点(例如DN2上)去请求BLK_3。
- 8、DN2节点将BLK_3数据传输给客户端,客户端将BLK_3数据追加到BLK_2后面,最后合并形成一个文件。
(二)下图是HDFS写数据流程图:
HDFS写数据流程.png- 1、客户端与NameNode建立通信,请求上传数据。NameNode检查目标文件是否存在,父目录是否存在。
- 2、NameNode响应客户端是否可以上传,如图,可以上传。
- 3、客户端会先对文件进行切分,比如一128M切分成一个BLK块。如图文件大小是300M就会被切分成3个块:两个128M,一个44M。客户端向NameNode请求上传第一个block所需要传输到哪些DN服务器上。
- 4、NameNode返回DN服务器信息(DN1、DN3、DN4)。
在这里,考虑因素:空间和距离
DataNode选择策略:
①第一个副本先考虑与client最近的(同机架)
②第二个副本再考虑跨机架挑选一个datanode,增加副本可靠性
③第三个副本在第一个副本同机架另外挑选一台datanode存放
配置机架感知,知道哪个datanode放在哪个机架。
- 5、客户端向DN1请求建立传输通道channel,DN1向DN3请求建立传输通道channel,DN3向DN4请求建立传输通道channel。
- 6、DN4建立好传输通道后会反向向DN3回应应答成功,同理DN3反向向DN1回应应答成功,DN1反向向客户端回应应答成功,传输通道channel已建立。
- 7、客户端开始传输BLK数据块(先从磁盘读取数据存储到一个本地内存缓存),以packet为单位(一个packet为64kb),写入数据的时候DataNode会进行数据校验,并不是通过packet为单位校验,而是以chunk为单位校验(512byte),DN1收到第一个packet就会传给DN3,DN3传给DN4;DN1每传一个packet就会放入一个应答队列等待应答。
在这里,block一个上传成功就算成功了,之后NameNode会做一步同步操作。
- 8、当第一个block上传完成后,客户端再次请求NameNode上传第二个block块。NameNode返回客户端第二个block块可上传的DataNode服务器节点信息。
网友评论