HDFS读写数据流程

HDFS作为分布式文件系统,储存文件的时候与我们自己常用的PC机自带的文件系统区别还是很大的。首先HDFS文件系统储存文件的时候会将文件分为块储存,2.0以及之后的版本默认是128M一块 之前是默认64M;并且每一个块默认保存3副本(副本之间无主从概念)。接下来看看
HDFS写数据流程
先来一张图镇楼
HDFS读写数据流程
这是写数据的流程图旁白注释已经很清楚了但是这只是理想的情况,如果在传输的时候出问题了该怎么解决呢?其实HDFS已经解决了这个容错问题了
HDFS读写数据流程
在这个流程中客户端需要向namenode申请可用的datanode来写入数据,此时就涉及到一个副本放置的问题,以默认的副本数=3为例:
1.第一个副本块放本机
2.第二个副本块存跟本机同机架内的其他服务器节点
3.第三个副本块存不同机架的一个服务器节点上
HDFS读写数据流程
HDFS读数据流程
读数据相对更简单
HDFS读写数据流程

  • 1、client端读取HDFS文件,client调用文件系统对象DistributedFileSystem的open方法
  • 2、返回FSDataInputStream对象(对DFSInputStream的包装)
  • 3、构造DFSInputStream对象时,调用namenode的getBlockLocations方法,获得file的开始若干block(如blk1, blk2, blk3, blk4)的存储datanode(以下简称dn)列表;针对每个block的dn列表,会根据网络拓扑做排序,离client近的排在前;
  • 4、调用DFSInputStream的read方法,先读取blk1的数据,与client最近的datanode建立连接,读取数据
  • 5、读取完后,关闭与dn建立的流
  • 6、读取下一个block,如blk2的数据(重复步骤4、5、6)
  • 7、这一批block读取完后,再读取下一批block的数据(重复3、4、5、6、7)
  • 8、完成文件数据读取后,调用FSDataInputStream的close方法
  • 同样会有容错问题需要解决
    情况一:读取block过程中,client与datanode通信中断
    • client与存储此block的第二个datandoe建立连接,读取数据
    • 记录此有问题的datanode,不会再从它上读取数据
      情况二:client读取block,发现block数据有问题
    • client读取block数据时,同时会读取到block的校验和,若client针对读取过来的block数据,计算检验和,其值与读取过来的校验和不一样,说明block数据损坏
    • client从存储此block副本的其它datanode上读取block数据(也会计算校验和)
    • 同时,client会告知namenode此情况;