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

1.写流程

FSDataOutputStream

在这里插入图片描述

	 这个过程对于我们操作者而言是无感知的
	 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.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.副本放置策略

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42585142/article/details/88370426
今日推荐