HDFS写数据流程:
详细步骤图:
详细描述:
1.客户端向NN发送文件上传的请求 2.NN进行一系列的检查:是否有权限,文件的父目录是否存在,文件是否已经存在同名等等,检查通过,允许上传 3.NN告知客户端允许上传 4.客户端发送真正的文件上传的请求,请求包含一个重要信息,文件的长度/大小 5.NN根据文件的长度计算文件的切块的个数(200M/128M = 2),以及获取文本的配置信息dfs.replication=3.
返回副本的节点信息(原则:就近原则 先客户端所在rack,同rack,不同rack)
Block1: host3,host1,host4
Block2: host7,host8,host4
6.客户端准备文件上传,
7.客户端对文件进行一个逻辑切块
8.开始上传第一个数据块
9.构建第一个数据块的上传通道pipline.(构建通道的时候,客户端启动一个阻塞进程,等待DN的相应)
10.客户端向DN发送第一个数据块。发送过程是以流式写入,流式写入过程如下:
1.将128M的block1按64k的packet划分
2.然后将第一个packet发送给host3(客户端上传是先上传到内存中,再上传到磁盘中)
3.host3接收完后,将第一个packet发送给host1,同时client想host3发送第二个packet
4.host1接收完第一个packet后,发送给host4,同时接收host3发来的第二个packet
5.以此类推,如图红线实线所示,直到将block1发送完毕
6.host3,host1,host4向NameNode,host3向Client发送通知,说“消息发送完了”。如图绿色细颜色实线所示
7.client收到host3发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图绿色细颜色实线所示
8.关闭当前pipline
11.发送完block1后,重复block1上传步骤,再向host7,host8,host5发送block2,如图蓝色细实线所示
12.当所有数据块上传完成,关闭当前的pipline。
补充:
pipline大小代码:
数据块的真实切分是客户端边上传边切分的,第一块到128M后,第一个数据库切分完成。
HDFS读数据流程:
详细步骤图:
详细描述:
读操作就简单一些了,如图所示,client要从datanode上,读取FileA。而FileA由block1和block2组成。
那么,读操作流程为:
a. client向namenode发送读请求。
b. namenode查看Metadata信息,返回fileA的block的位置。
Block1:host3,host1,host4
Block2:host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2。而且block1去host3上读取;然后block2,去host7上读取;
注意:
上面例子中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。
详细流程
1、使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求;
2、namenode 会视情况返回文件的全部 block 列表,对于每个 block,namenode 都会返回有
该 block 拷贝的 datanode 地址;
3、客户端Client会选取离客户端最近的datanode来读取block;如果客户端本身就是datanode,
那么将从本地直接获取数据;
4、读取完当前 block 的数据后,关闭当前的 datanode 链接,并为读取下一个 block 寻找最
佳的 datanode;
5、当读完列表 block 后,且文件读取还没有结束,客户端会继续向 namenode 获取下一批的
block 列表;
6、读取完一个 block 都会进行 checksum 验证,如果读取 datanode 时出现错误,客户端会
通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。