其他分享
首页 > 其他分享> > hadoop入门(12):hdfs的读写流程

hadoop入门(12):hdfs的读写流程

作者:互联网

hdfs的写入流程

hdfs写入
文件具体上传流程如下:

HDFS写数据-容错

Q: 如果在传输过程中dn2挂了,则当前piprline中断,hdfs会怎么样?
A: 客户端RPC会调用namenode的updateBlockPipeline()为当前block(假设为blk1)生成新的版本比如ts1(本质上是时间戳),故障dn2会从pipeline中删除。
DFSOutputStream再RPC调用namenode的getAdditionalDatanode()让namenode重新分配datanode假设为dn4。让dn1、dn3、dn4组成新的管道,他们上边的blk1版本设置为新版本ts1.
由于dn4上没有blk1的数据,客户端告诉dn1、dn3将其上的blk1数据拷贝给dn4.
新的管道建立好之后,DFSOutputStream调用updatePipeline()更新namenode元数据。到此,pipeline恢复,客户端继续上传文件。
故障的datanode重启后,namenode发现其上面的blk1的时间戳是老的,会让datanode将blk1删除掉。

hdfs的读取流程

hdfs读取数据
文件的具体读取流程如下:

  1. Client端读取hdfs文件,client调用文件系统对象DistributedFileSystem的open方法
  2. 返回FSDataInputStream对象(对DFSInputStream的包装)
  3. 构造DFSInputStream对象时,调用namenode的getBlockLocation方法,获得file开始的若干个block的存储datanode列表;针对每个block的dn列表,会根据网络拓扑排序,离client近的排在前面。
  4. 调用DFSInputStream的read方法读取blk1的数据,与client最近的datanode建立连接,读取数据。
  5. 读取完后,关闭与dn建立的流。
  6. 重复4、5、6步骤,紧接着读取下一个块的数据,直到这一批块的数据读完。
  7. 读取下一批块,重复3、4、5、6、7
  8. 调用FSDataInputStream的close方法

HDFS读数据-容错

Q: 读取block数据时,client与datanode连接中断会怎么办?
A: client与第二个存储此block的datanode建立连接,存储数据。记录出问题的datanode,不会再从其上读取数据。

Q: client读取数据时,发现block块的数据有问题怎么办?
A: client读取数据时,同时会读取到block的校验和,若client针对读取的block计算校验和发现与其读取的校验和不一致,说明block损坏。client会从其它存放此block的datanode读取数据,同样会计算校验和,同时告诉namenode此情况。

标签:hdfs,12,blk1,hadoop,packet,client,datanode,namenode,block
来源: https://www.cnblogs.com/S2Jgogo/p/15978061.html