且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Hadoop技术详解》一2.3 守护进程

更新时间:2022-09-25 23:16:03

本节书摘来异步社区《Hadoop技术详解》一书中的第2章,第2.3节,作者: 【美】Eric Sammer 译者: 刘敏 , 麦耀锋 , 李冀蕾 , 等,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 守护进程

一个标准HDFS集群由3个守护进程组成,如表2-1所示。


《Hadoop技术详解》一2.3 守护进程

数据块可以理解为二进制数据文件的主要组成单元。在HDFS中,负责数据存储和获取的守护进程就是DataNode,简称(DN)。数据节点可以直接访问本地挂载的一个或多个磁盘,通常又称数据磁盘。这些挂载在服务器上的磁盘可以用来存储块数据。在产品系统中,这些磁盘通常为Hadoop独有。通过在集群中增加数据节点或者给现有数据节点添加磁盘,就可以轻松实现系统存储空间的扩容。

HDFS的另一个最显著优点是它存储数据块时并不需要RAID的支持,这就可以达成只需要使用低成本商用硬件的设计目标,减少集群扩容的成本。数据块的安全可以通过在多台机器同时保留多份数据块副本得以保证,而不需要依赖磁盘阵列(RAID)。增加数据块副本的方案可能因安全考量增加了原始数据的存储成本,但也因此提升了处理效率。将数据块的多个副本保存在多台机器上,既避免了数据块因机器故障而丢失,同时又可以在处理数据时使用该数据的任何一个副本。因为有多份数据可供选择,调度器在调度任务时,可以更灵活地将计算任务安排在拥有数据备份的机器上。详细情况,请阅读第3章。

放弃使用RAID是有争议的,很多人认为RAID就像一个神奇的加速按钮,可以让磁盘运行更快。然而,事实并非如此。在Hadoop特定的应用场景中,数量巨大的独立磁盘,搭配独立I/O队列,能承受巨量的顺序I/O操作,其性能往往会比RAID高出许多。通常,DataNodes拥有大量的独立磁盘,每块磁盘都保存着完整的数据块。相关话题的深入讨论请参见4.2.4节“刀片服务器,存储区域网络(SANs)和虚拟化”。

DataNode守护进程负责存储数据块,而NameNode(或简写成NN)守护进程则负责保存文件系统的元数据,并维护文件系统全景图。尽管用户是连接在NameNode上进行文件系统操作的,但正如我们稍后将要看到的那样,数据块是直接流入和流出DataNode的,因此单个节点不会成为整个系统的瓶颈。DataNode通过周期性心跳向NameNode报告各自的状态。因而,在任何时刻,NameNode都掌握着整个集群中每个DataNode的状态:它们是否工作正常,哪些数据块是可用的等。图2-1给出了一个HDFS架构的实例。


《Hadoop技术详解》一2.3 守护进程

在DataNode初始化的过程中,以及之后每隔1小时,都会向NameNode发送一个块报告(block report)。所谓“块报告”,就是一个包含DataNode磁盘中所有数据块信息的列表,这样NameNode就可以跟踪数据块的任何变化。块报告是非常重要的,因为在NameNode磁盘中保存了文件与数据块的映射关系,却并不保存数据块的位置信息。这乍看起来似乎有悖常理,但这种设计的优点就是即便DataNode的IP地址或主机名发生了改变,也不会影响文件系统中元数据的存储。这样做还有一个附带的好处,当一个DataNode的主板发生故障时,管理员只需拆下硬盘,将它们插入新的机箱,然后启动新机器,这依然不会影响元数据的存储,在NameNode中看到的就是数据块迁移到了一个新的DataNode上。当然这样做也有副作用,当全新初始化启动一个集群(在这种情况下,重启集群也是一样的),NameNode必须收集齐所有DataNode的块报告后才能知道所有数据块的存在。

为了快速查找和获取文件信息,NameNode文件系统的元数据全部保存在RAM中。当然这样做就会限制NameNode能处理的元数据的大小。粗略地估计,1GB的内存可以管理大约100万个数据块(更多内容请参见4.2节“硬件选型”)。稍后我们将讨论如何突破这种限制。当然这种突破也不常发生,只有在超大规模的集群中(上万个DataNodes),才有可能需要这种突破。

HDFS第三个守护进程就是次NameNode,它主要负责NameNode内部的维护清理工作。可千万不要受这个名字迷惑,次 NameNode可不是NameNode的备份进程,它的功能与NameNode 也完全不同。

图像说明文字
次NameNode可能是计算机历史上对进程的最糟糕的命名之一。很多Hadoop的初学者可能会受到这个名字的欺骗,误以为在NameNode出现故障而不能正常工作时,次NameNode会自动成为新的NameNode,这样集群就可以继续运作。其实不然,稍后将介绍次 NameNode的功能。这里只是提请读者注意,在关注次NameNode是什么的同时,也要记住它们不是什么。