第1章 写数据
-
Client向NameNode发起上传请求。
-
NameNode检查文件是否存在等信息(权限、目录等),检查通过后,返回给Client允许上传。
-
Client将数据切分成n个block块,block大小默认128M。将文件缓存到本地的临时文件当中。并向NameNode发起RPC请求,请求上传第一个block块。
-
NameNode根据文件配置的副本数、机架感知,来计算并返回DataNode列表。(详见:第3章 副本策略)
-
Client再次对Block进行切分,每一个数据包大小为64k(配置文件dfs.client-write-packet-size设置其大小),然后写入一个内部数据队列中。
-
Client选择与其最近的DataNode节点进行数据上传,列表中的DataNode节点建立pipeline通道。DataNode之间通过pipeline进行副本的拷贝。
-
DataNode副本拷贝完成后,向前Pipeline前面的DataNode节点反馈信息。
-
第一个Block上传完毕后,Client再次请求NameNode上传第二个Block(4-7步)。
-
Client上传完所有Block后,会向NameNode进行反馈。
第2章 读数据
-
Client向NameNode发送文件下载请求。
-
NameNode检查请求文件是否存在、权限等信息,检查完成后,通过元数据信息找到文件各数据块存储的DataNode位置信息,返回给Client。
文件Block位置信息大致如下:
blk001:hadoop100,hadoop101
blk002:hadoop101,hadoop102
-
Client根据Block存储的位置信息,开始进行第一个Block块的下载,从Client最近的一个DataNode节点进行下载(优先顺序:Client所在节点->同机架其他节点->不同机架的节点)。注意:如果下载失败会进行重试,超过一定次数会返回给NameNode,并从其他节点进行下载。
-
依次下载所有Block块。
-
所有块文件下载完成后,Client向NameNode反馈信息。
第3章 副本策略
-
第一个副本:优先考虑网络传输效率,选择Client所在节点,前提是Client所在节点是一个DataNode节点,否则随机存放在一个DataNode节点;
-
第二个副本:优先考虑可靠性,选择于第一个副本不同机架的一个节点;
-
第三个副本:选择第二个副本同机架上的不同节点;
-
其他副本:随机选择节点存储。