《Hadoop权威指南:大数据的存储与分析》—3.6 数据流

举报
清华大学出版社 发表于 2019/10/12 14:05:50 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第三章,第3.6.1节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

3.6  数据流

3.6.1  剖析文件读取

为了了解客户端及与之交互的HDFSnamenodedatanode之间的数据流是什么样的,我们可参考图3-2,该图显示了在读取文件时事件的发生顺序。

客户端通过调用FileSyste对象的open()方法来打开希望读取的文件,对于HDFS 来说,这个对象是DistributedFileSystem的一个实例(3-2 中的步骤1)DistributedFileSystem通过使用远程过程调用(RPC)来调用namenode,以确定文件起始块的位置(步骤2)。对于每一个块,namenode返回存有该块副本的datanode地址。此外,这些datanode根据它们与客户端的距离来排序(根据集群的网络拓扑;参见3.6.1节的补充材料)。如果该客户端本身就是一个datanode (比如,在一个MapReduce任务中),那么该客户端将会从保存有相应数据块复本的本地datanode读取数据(参见图2-210.3.5)

image.png

3-2. 客户端读取HDFS中的数据

DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端以便读取数据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着datanodenamenodeI/O

接着,客户端对这个输入流调用read()方法(步骤3)。存储着文件起始几个块的datanode地址的DFSInputStream随即连接距离最近的文件中第一个块所在的datanode。通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端(步骤4)。到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳datanode(步骤5)。所有这些对于客户端都是透明的,在客户看来它一直在读取一个连续的流。

客户端从流中读取数据时,块是按照打开DFSInputStreamdatanode新建连接的顺序读取的。它也会根据需要询问namenode来检索下一批数据块的datanode的位置。一旦客户端完成读取,就对FSDataInputStream调用close()方法(步骤6)

在读取数据的时候,如果DFSInputStream在与datanode通信时遇到错误,会尝试从这个块的另外一个最邻近datanode读取数据。它也记住那个故障datanode,以保证以后不会反复读取该节点上后续的块。DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现有损坏的块,DFSInputStream会试图从其他datanode读取其复本,也会将被损坏的块通知给namenode

这个设计的一个重点是,客户端可以直接连接到datanode检索数据,且namenode告知客户端每个块所在的最佳datanode。由于数据流分散在集群中的所有datanode,所以这种设计能使HDFS扩展到大量的并发客户端。同时,namenode只需要响应块位置的请求(这些信息存储在内存中,因而非常高效),无需响应数据请求,否则随着客户端数量的增长,namenode会很快成为瓶颈。

网络拓扑与Hadoop

在本地网络中,两个节点被称为彼此近邻是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率带宽很稀缺。这里的想法是将两个节点间的带宽作为距离的衡量标准。

不用衡量节点之间的带宽,实际上很难实现(它需要一个稳定的集群,并且在集群中两两节点对数量是节点数量的平方)adoop为此采用一个简单的方法:把网络看作一棵树,两个节点间的距离是它们到最近共同祖先的距离总和。该树中的层次是没有预先设定的,但是相对于数据中心、机架和正在运行的节点,通常可以设定等级。具体想法是针对以下每个场景,可用带宽依次递减:

l     同一节点上的进程

l     同一机架上的不同节点

l     同一数据中心中不同机架上的节点

l     不同数据中心中的节点[1]

 

例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述:

l     distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)

l     distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)

l     distance(/d1/r1/n1, /d1/r2/n3)=4(同一数据中心中不同机架上的节点)

l     distance(/d1/r1/n1, /d2/r3/n4)=6(不同数据中心中的节点)

 

示意图参见图3-3(数学爱好者会注意到,这是一个测量距离的例)

最后,我们必须意识到Hadoop无法自动发现你的网络拓扑结构。它需要一些帮助(我们将在10.1.2节的网络拓扑中讨论如何配置网络拓扑)。不过在默认情况下,假设网络是扁平化的有一层或换句话说,所有节点都在同一数据中心的同一机架上。规模小的集群可能如此,不需要进一步配置。

image.png

3-3. Hadoop中的网络距离


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。