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