共计 1333 个字符,预计需要花费 4 分钟才能阅读完成。
上一篇文章中简单介绍了一下 Hadoop 文件存储的一些逻辑与简单原理(见 http://www.linuxidc.com/Linux/2015-02/113638.htm),既然后写入,那肯定要读取分析数据咯,下面我在白话一下 hdfs 中文件读取的逻辑与简单原理。
第一步:跟写入文件一样,首先客户端会调用 DistributedFilesyStem 对象的 open()方法来打开文件,这个方法要做的事情就是:Distributed FilesyStem 会通过 RPC 协议连接来调用 namenode,namenode 里面存储的都是文件命名空间,也就是文件存储在 datanode 的地址,我们首先获取到要想读取的文件头所在的位置,块中存在很多个数据节点副本,hadoop 会根据一定的标准找到距离客户端最近的一个节点,此时便返回一个 FSData InputStream,否则返回 ioexception
第二步:紧跟着,客户端会读取返回去的文件输入流,此时文件头存储的 datanode 会自己寻找这些块中距离自己最近的其他 datanode,并且建立起链接,客户端持续 read,直到读取到块的末尾。从 namenode 中找到下一个块的地址,并找到最佳的文件节点位置。持续重复上面的动作。知道读取完成之后,文件输入流会调用 close 方法关闭流,
下面我们讨论下异常处理的机制:
如果客户端在读取数据流的时候遇到了错误块,怎么办眤?
如果客户端遇到了异常块,那么客户端就会记录下来这个块,并尝试去读取距离这个块最近的一个块,并且不会再去读取这个损坏的块。
同时客户端还会去校验接受到的数据的校验和,若发现一个损坏的块,它就会在客户端试图从别的数据节点中读取一个块的副本之前报告给名称节点。
在之前我们一直提到的 hadoop 的寻找最近的块或者节点的机制是如何实现呢?
我们都知道。在大数据存储中,限制效率的最主要因素就是带宽。
hadoop 将网络看成一棵树,两个节点间的距离是距离它们最近的共同祖先的总和。
对于以下每个场景,可用带宽依次减少:
相同节点中的进程
同一机架上的不同节点
同一数据中心的不同机架上的节点
不同数据中心的节点
Hadoop 中 HDFS 读取和写入的工作原理 http://www.linuxidc.com/Linux/2015-02/112775.htm
将本地文件拷到 HDFS 中 http://www.linuxidc.com/Linux/2013-05/83866.htm
从 HDFS 下载文件到本地 http://www.linuxidc.com/Linux/2012-11/74214.htm
将本地文件上传至 HDFS http://www.linuxidc.com/Linux/2012-11/74213.htm
HDFS 基本文件常用命令 http://www.linuxidc.com/Linux/2013-09/89658.htm
Hadoop 中 HDFS 和 MapReduce 节点基本简介 http://www.linuxidc.com/Linux/2013-09/89653.htm
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13