对HDFS的读流程和写流程的理解

一.HDFS写文件流程图
对HDFS的读流程和写流程的理解_第1张图片
二.HDFS写文件流程
(1)调用客户端的对象DISTRIBUTEDFILESYSTEM()的CREATE方法;
(2)DISTRIBUTEDFILESYSTEM会发起对NAMENODE的一个RPC连接,请求创建一个文件,。NAMENODE会执行各种各样的检查,确保要创建的文件不存在,并且客户端有创建文件的权限。如果检查通过,NAMENODE会创建一个文件(在EDITS中),否则创建失败,客户端抛异常IOEXCEPTION。
(3)DISTRIBUTEDFILESYSTEM返回一个FSDATAOUTPUTSTREAM对象给客户端用于写数据。FSDATAOUTPUTSTREAM封装了一个DFSOUTPUTSTREAM对象负责客户端跟DATANODE以及NAMENODE的通信。
(4)FSDATAOUTPUTSTREAM将数据切分,并请求NAMENODE返回一个DATANODE列表来存储当前BLOCK副本。然后这些DATANODE会生成一个数据流管道,我们假设副本集参数被设置为3,那么这个数据流管道中就有三个DATANODE节点。
(5)首先FSOUTPUTSTREAM会将文件块向数据流管道中的第一个DATANODE节点写数据,第一个DATANODE接收文件块后会把文件块写向数据流管道中的第二个节点,同理,第二个节点接收保存数据块后会将数据块写向数据流管道中的第三个DATANODE节点。
(6)当第三各DATANODE节点数据库写入成功后,会向第二个DATANODE节点发送数据写入成功的确认消息,第二个DATANODE节点收到第三个的确认消息后会向第一个DATANODE节点发送数据写入成功的确认消息。当三个节点都确认数据写入成功后DATANODE会向FSOUTPUTSTREAM对象发送ACK PACKETS,最后会调用对象的CLOSE()方法。

三.HDFS读文件流程图

对HDFS的读流程和写流程的理解_第2张图片

四.HDFS读文件流程
(1)客户端通过FILESYSTEM对象的OPEN方法打开希望读取的文件,DISTRIBUTEDFILESYSTEM对象通过RPC调用NAMENODE,以确保文件起始位置。(对于每个BLOCK,NAMENODE返回存有该副本的DATANODE地址。这些DATANODE根据它们与客户端的距离来排序。如果客户端本身就是一个DATANODE,并保存有相应BLOCK一个副本,会从本地读取这个BLOCK数据)。
(2)DISTRIBUTEDFILESYSTEM返回一个FSDATAINPUTSTREAM对象给客户端读取数据。该类封装了DFSINPUTSTREAM对象,该对象管理着DATANODE和NAMENODE的I/O,用于给客户端使用。
(3)客户端调用FSDATAINPUTSTREAM对象的READ()方法 会去与第一个块的最近的DATANODE进行READ,读取完后,会CHECK,假如SUCCESSFUL,会关闭 与当前 DATANODE通信; (假如CHECK FAIL,会记录失败的块+DATANODE信息,下次就不会读取;那么会去该块的第二个 DATANODE地址读取) 然后去第二个块的最近的Datanode上的进行读取,check后,会关闭与此datanode的通信。假如block列表读取完了,文件还未结束,那么FileSystem会从Namenode获取下一批的block的列表。
(4)客户端将文件块读取完整后,会调用FSDataInputStream的close()方法,关闭输入流。

你可能感兴趣的:(hadoop)