HDFS写数据流程

HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小,2.X/3.X版本中是128M,1.X版本中是64M。128M指的是上限。

(1) 客户端发起文件上传请求,通过RPC(远程过程调用)与NameNode建立通讯。

(2) NameNode检查元数据文件的系统目录树。

(3) 若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件。

(4) 客户端请求上传第一个Block数据块,以及数据块副本的数量(可以自定义副本数量,也可以使用集群规划的副本数量)。

(5) NameNode检测元数据文件中DataNode信息池,找到可用的数据节点(DataNode_01,DataNode_02,DataNode_03)。

(6) 将可用的数据节点的IP地址返回给客户端。

(7) 客户端请求3台节点中的一台服务器DataNode_01,进行传送数据(本质上是一个RPC调用,建立管道Pipeline),DataNode_01收到请求会继续调用服务器DataNode_02,然后服务器DataNode_02调用服务器DataNode_03。

(8) DataNode之间建立Pipeline后,逐个返回建立完毕信息。

(9) 客户端与DataNode建立数据传输流,开始发送数据包(数据是以数据包形式进行发送)。

(10) 客户端向DataNode_01上传第一个Block数据块,是以Packet为单位(默认64K),发送数据块。当DataNode_01收到一个Packet就会传给DataNode_02,DataNode_02传给DataNode_03; DataNode_01每传送一个Packet都会放入一个应答队列等待应答。

(11) 数据被分割成一个个Packet数据包在Pipeline上依次传输,而在Pipeline反方向上,将逐个发送Ack(命令正确应答),最终由Pipeline中第一个DataNode节点DataNode_01将Pipeline的 Ack信息发送给客户端。

(12) DataNode返回给客户端,第一个Block块传输完成。客户端则会再次请求NameNode上传第二个Block块和第三块到服务器上,重复上面的步骤,直到3个Block都上传完毕。

原文地址:https://www.cnblogs.com/danyuzhu11/p/15712863.html