你好,游客 登录 注册 搜索
背景:
阅读新闻

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

[日期:2015-02-18] 来源:Linux社区  作者:snwz [字体: ]

上一篇文章中简单介绍了一下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

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-02/113639.htm

linux
相关资讯       Hadoop HDFS 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款