HDFS写流程
HDFS写流程:
- HDFS Client (基于JVM)调用 Distributed FileSystem.create方法,将文件路径传给NameNode,并与NameNode进行 RPC 通信。然后 NameNode 去check该路径这个文件是否已经存在,并check 是否有权限操作。如果OK,就创建一个新的文件,但是不关联任何 block 块(这时并没有真正地写)。NN根据上传的文件大小及副本数,计算出需要多少块以及块存放的 DN ,最终将这些信息返回给client node,形成FSData OutputStream 对象。
- 调用FSData OutputStream.write()方法,将第一个块的第一个副本写到第一个DN,写完写第二个副本,写完写第三个副本 。当第三个副本写完以后,将ack pacage(ack确认包)返回给第二个副本的DN,然后第二个副本的DN返回ack确认包给第一个副本的DN,然后第一个副本的DN返回ack确认包给FSData OutputStream对象,标识第一个块的三个副本写完了。开始写第二个块的三个副本。
- 当向文件写入数据完成后,client端调用FSData OutputStream的close()方法,关闭输出流,flush 缓存区的数据包
- 再调用Distributed FileSystem.complete()方法,告诉NN写入成功。
(写的这个过程,用户是看不见的。)
HDFS读流程
- Client通过Stributed FileSystem.open(filepath),去与NN进行RPC通信,返回该文件的部分或者全部block列表,也就是返回FSData InputStream 对象;
- Client 调用 FSData InputStream.read()方法
a. 去与第一个块的最近的DN进行read,读取完后,会check:
假如success,会关闭与当前DN通信;
假如fail,会记录失败的DN + block信息,下次就不会读取,那么会去该块的第二个DN的地址读取;
b. 然后去第二个块进行操作。
c.假如当前block列表全部读取完成,文件还没结束,那么FileSystem 会继续从NN上获取block列表。这些是对用户透明的,用户感觉是连续的。 - Client调用FSData InputStream.close(),关闭输入流