HDFS读流程:
1.HDFS Client调用FileSystem.open(filePath)
2.与NN进行【RPC】通信,返回该文件的block列表
将该列表返回 FSDataInputStream 对象
3.HDFS Client调用FileSystem.read方法
4.与第一个块最近的DN进行读取,读取完成后,检查是否OK
检查是否OK
如果OK,就回关闭与DN的通信
如果不OK,就会从第二个节点去读取,以此类推
5.当block列表全部读取完了
6.HDFS Client 调用FSDataInputStream.close
关闭数据流
HDFS写流程:
1.HDFS Client调用 FileSystem.create(filepath)方法
2.与NN进行【RPC】通信
NN会检查这个文件是否存在?是否有权限创建这个文件
如果都可,就创建一个文件,这个时候文件是没有数据的,也不关联block
NN会再根据文件的大小,块大小,副本数等
计算要上传多少的块和对应的DN节点
最终这个信息返回给给客户端的【FSDataOutputStream】对象
3.HDFS Client 调用客户端【FSDataOutputStream】的write方法
4.根据NN返回的信息,将第一个块的第一个副本写到DN1,
写完复制到DN2,再复制到DN3
5.当三个副本写完,DN3返回ack(确认字符)DN2
DN2接收到ack,返回ack给DN1
DN1接收到ack,返回ack给【FSDataOutputStream】
告诉它第一个块的三个副本写完了
以此类推
6.当所有的块全部写完,
HDFS Client 调用【FSDataOutputStream】的close方法
关闭数据流
7.然后调用FileSystem.complete方法,告诉NN文件写成功
自己画流程图的时候,画完发现自己InputStream和OutputStream还是画反了
读是6步,写是7步,读的步骤少Stream短,是Input,写的步骤多,Stream长,是Output
写的Stream比读的Stream多一个字母