hdfs的写入过程和读取过程

hdfs的写入过程和读取过程

hdfs的写入过程

 

 先说总结:

1、客户端Client和Namenode通信(步骤1-6)

2、客户端Client将block块上传到Datanode节点中(步骤7-10)

3、重复步骤4-10,直到所有的block块都上传完成,完成写入过程

 

详细步骤:

 

1、客户端(Client)发出请求(将请求发给namenode,通过RPC与namenode建立通信),这里以 将大小为300M的a.txt文件上传到 根目录下(/a.txt)为例

2、namenode对收到的请求做出检测;检测1:检测客户端是否有上传权限,检测2:所上传的路径下是否存在重名文件,(即根目录下是否有a.txt)

3、检测通过,反馈给客户端 可以上传的指令

4、客户端接到反馈,将文件进行预处理(a.txt大小为300M,一个block的大小默认为128M,因此分为3个block(如上图红、蓝、浅紫色三块block),编号为block1,block2,block3,其中block3不满128M),向namenode发出上传block1的请求。

5、namenode根据集群中网络拓扑和机架感知以及副本机制进行文件分配,选出可以上传的3个主机地址列表(默认为三个,一份存放于本地,一份存放于同机架内的datanode,一份存放于不同机架内的datanode),分别是datanode1,datanode2,datanode3(注意,namenode实际上并没有和datanode直接通信,只是选出三个可用的datanode的地址)

6、namenode将datanode地址列表返回给客户端Client。

7、客户端Client与datanode1进行通信(本质是RPC调用),建立pipeline,用于传输文件。当datanode1收到请求后会去与datanode2进行通信并建立pipeline(注意,这里不是客户端Client与datanode2进行通信),然后datanode2收到请求后会向datanode3进行通信并建立pipeline,如此一级接一级,直到pipeline建立完成,再逐级返回给Client。

8、客户端Client准备上传第一个block1(先从磁盘读取数据然后放到本地内存缓存),先将大小为128M的block1切分为64KB的数据包packet(2000个packet)(单位为packet,64KB)。

9、datanode1接收到第一个packet数据包并缓存到对应的目录下,再将第一个packet通过pipeline传输给datanode2,将packet传送完成后datanode1会加入一个等待应答队列等待datanode2应答,同理datanode2接收packet信息并缓存到对应目录下,再传给datanode3,datanode2将packet传送完成后会加入一个应答队列等待datanode3应答,datanode3接收packet并缓存。

10、 datanode3缓存第一个packet后会给datanode2发送一个ack的正确应答,然后datanode2向datanode1发送正确应答ack,最后由datanode1向客户端Client发送ack,至此第一个block0的第一个packed传输完成,客户端开始发送下一个packet,直到第一个block0传输完成。

11、跳转到第四步,客户端向namenode发出上传block1的请求,重复4-10(注意,新的三个datanode地址列表不一定和之前的datanode相同),直到第三个block传输完成后,写入完成。

hdfs的读取过程

 

 

 

和写入差不多,最后下载的三个block重新组装成一个整体,图已经很详细了,注意的是第三步会返回距离客户端最近的datanode主机。有时间再写。

 

 

 水平有限,如有错误,欢迎指正,谢谢!

posted @ 2020-11-18 20:12  destiny-2015  阅读(264)  评论(0编辑  收藏  举报