HDFS的读写流程及副本放置机制

1.写流程

FSDataOutputStream

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
这个过程对于我们操作者而言是无感知的
1.Client调用FileSystem.creat(filePath)方法,去与NN进行【RPC】通信,nn check该路径
文件是否存在以及有没有权限创建该文件。假如OK,就创建一个新的文件,但是不关联任何的block,
nn根据上传的文件大小且块大小且副本数,计算多少块,以及块存放的dn,最终将这些信息返回给客
户端,则为【FSDataOutputStream】
2.Client调用FSDataOutStream.write方法,将第一个块的第一个副本写到第一个DN,写完写第
二个副本,写完写第三个副本,当第三个副本写完,返回ack packet给第二个副本的DN,然后第二
个副本返回ack packer给第一个DN,第一个DN返回 ack packet给FSDdataOutputStream对象,
标识第一个块三个副本写完了,然后依次写剩余的块。
3.当文件写入数据完成后,Client掉用FSDataOutputStream.close()方法,关闭输出流,flush
换成区的数据包。再次调用FileSysteam.complete(),通知NN节点写入成功。
3DN
3副本
副本数=DN

1DN
1副本
测试:DN挂了 能不能写入
同比:3DN 3副本 1DN挂了 肯定写不成功

如果10DN
3副本
副本书<DN
测试:DN挂了,是可以写入的

总结:存活的DN满足我们的副本书 就能写

2.读流程

FSDataIntputStream

在这里插入图片描述

1
2
3
4
5
6
7
8
9
1.Client通过FileSystem.open(filePath),去与NN进行【RPC】通信,返该文件的部分或全部
的block列表,也就是返回FSDataInputStream对象。
2.Client调用【FSDataInputStream】对象的read()方法,
a.去与第一个块的最近的DN进行read,读取完后,会check,假如success,会关闭与当前DN通信。
假如fail 会记录失败的DN +block信息,下次就不会读取,那么会去该块的第二个DN地址读取。
b.然后去第二个块的最近的DN读取,会check,如果cuccess,会关闭与当前DN的通信
c.假如当前block列表全部读取完成,文件还没有结束,那么FileSystem会从NN获取下一批大的
block列表。
3.Client调用FSDataInputStream.close()关闭输入流。

3.副本放置策略

1
生产上尽量将读写的动作 选取DN节点

在这里插入图片描述

本文标题:HDFS的读写流程及副本放置机制

文章作者:skygzx

发布时间:2019年04月07日 - 09:44

最后更新:2019年04月07日 - 15:23

原始链接:http://yoursite.com/2019/04/07/HDFS的读写流程及副本放置机制/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%