剖析HDFS读写:namenode和datanode节点之间运行过程

数据流:

1、 剖析文件读取:

FileSystem对象则是负责与namenode联系,获取到block location,再将该信息给FSDataInputStream构建对象,在这个图中还缺少了一个中间流,也就是DFSInputStream对象,这个对象是由FSDataInputStream构建的,用于直接在datanode进行数据块的读取(这里会排序拓扑最近的优先加载),FSDataInputStream负责关闭数据流。

DFSInputStream还会校验block是否损坏,如果损坏,会记住这个损坏的block,并且会向namenode报告,转而读取下一个副本,估计使用MD5加密算法获取数字指纹吧,这里完全是个人猜测啦。

这样namenode就可以告诉客户端最近最佳的块的位置所在的datanode,而且namenode只提供了块位置的信息,这些信息全在内存中,获取这些信息就是一个字,快。注意:datanode也会是客户端哦(^*^) 

如图:

2、 剖析文件写入

1、 客户端先向namenode报告,我要写入这个文件,namennode说:”让我看看我又没有这个文件,嗯,我没有,再让我检查一下你有没有写入的权利,嗯,好的”,你可以去写入了。但是里面还有一个DataStream来处理client端发来的数据包,并且根据这些数据包的数量和大小,来向namenode申请存储在哪个datanode上,而且DFSOutputStream也会督查(利用确认队列)是否所有的datanode都成功保存到了数据。

2、 如果datanode故障,就去下游节点存,但是要把所有的数据包添加回数据队列,以保护数据的完整性。

3、 复本的存放策略:默认客户端节点存一个,如果客户端不在集群中就随机选一个存,

然后在另外一个机架上再存两个复本。这样做保证了数据的冗余,又节省网络带宽。


猜你喜欢

转载自blog.csdn.net/qq_40898500/article/details/80041496
今日推荐