Hadoop中HDFS读取文件的原理剖析

第一步:跟写入文件一样,首先客户端会调用DistributedFilesyStem 对象的open()方法来打开文件,这个方法要做的事情就是:Distributed FilesyStem会通过RPC协议连接来调用namenode,namenode里面存储的都是文件命名空间,也就是文件存储在datanode的地址,我们首先获取到要想读取的文件头所在的位置,块中存在很多个数据节点副本,hadoop会根据一定的标准找到距离客户端最近的一个节点,此时便返回一个FSData InputStream,否则返回ioexception

第二步:紧跟着,客户端会读取返回去的文件输入流,此时文件头存储的datanode会自己寻找这些块中距离自己最近的其他datanode,并且建立起链接,客户端持续read,直到读取到块的末尾。从namenode中找到下一个块的地址,并找到最佳的文件节点位置。持续重复上面的动作。知道读取完成之后,文件输入流会调用close方法关闭流,

下面我们讨论下异常处理的机制:

如果客户端在读取数据流的时候遇到了错误块,怎么办眤?

如果客户端遇到了异常块,那么客户端就会记录下来这个块,并尝试去读取距离这个块最近的一个块,并且不会再去读取这个损坏的块。

同时客户端还会去校验接受到的数据的校验和,若发现一个损坏的块,它就会在客户端试图从别的数据节点中读取一个块的副本之前报告给名称节点。

在之前我们一直提到的hadoop的寻找最近的块或者节点的机制是如何实现呢?

我们都知道。在大数据存储中,限制效率的最主要因素就是带宽。
hadoop将网络看成一棵树,两个节点间的距离是距离它们最近的共同祖先的总和。
对于以下每个场景,可用带宽依次减少:
相同节点中的进程
同一机架上的不同节点
同一数据中心的不同机架上的节点
不同数据中心的节点

相关推荐