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 | 1.Client通过FileSystem.open(filePath),去与NN进行【RPC】通信,返该文件的部分或全部 |
3.副本放置策略
1 | 生产上尽量将读写的动作 选取DN节点 |