HDFS 读写流程

关于HDFS文件的读写流程



读流程(FSDataInputStream)

Client上传文件到HDFS,也就是类似于下面的命令:

1
hadoop fs -get /test.log

HDFS文件写流程

HDFS读的过程:
  1. Client调用FileSystem.open(filePath)方法,与NN进行[RPC]通信,返回该文件的部分或者全部的block列表,也就是返回FSDataInputStream对象。
  2. Client调用FSDataInputStream.read()方法。
    a.与第一个块最近的DN进行read,读取完成后,会check;假如OK,就关闭与当前DN的通信;假如失败,会记录失败块+DN信息,下次不会再读取,会去该块的第二个DN地址读取。
    b.接着去第二个块的最近的DN上通信读取,check后,关闭通信。
    c.假如block列表读取完成后,文件还未结束,FileSystem会再次从NN获取该文件的下一批次的block列表。
    (感觉就是连续的数据流,对于客户端操作是透明无感知的)
  3. Client调用FSDataInputStream.close()方法,关闭输入流。

写流程(FSDataOutputStream)

Client上传文件到HDFS,也就是类似于下面的命令:

1
hadoop fs -put test.log /

HDFS文件写流程

HDFS写的过程:
  1. Client 调用FileSystem.create(filePath)方法,与NN进行[RPC]通信,check是否存在及是否有权限创建。假如不OK,就返回错误信息;假如OK,就创 建一个新文件,不关联任何的block块,返回一个FSDataOutputStream对象。
  2. Client调用FSDataOutputStream对象的write()方法,先将第一块的第一个副本写到第一个DN,第一个副本写完就传输给第二个DN,第二个副本写完就传输给第三个DN,直至写完第三个副本。然后返回一个ack packet确认包给第二个DN,第二个DN接收到第三个的ack packet确认包加上自身OK,就返回一个ack packet确认包给第一个DN,第一个DN接收到第二个DN的ack packet确认包加上自身OK,就返回ack packet确认包给FSDataOutputStream对象,标志第一个块的3个副本写完。依次写完余下的块。
  3. 当文件写入数据完成后,Client调用FSDataOutputStream.close()方法,关闭输出流。
  4. 然后调用FileSystem.complete()方法,告诉NN该文件写入成功。