所以我在读hadoop:权威指南。这一页的一句话让我困惑。所以我创建了一个描述每个句子的图像。
这句话说,
在federation下,每个namenode管理一个名称空间卷(黑色方框表示名称空间卷),该卷由名称空间的元数据组成,以及一个块池(由深灰色矩形表示),其中包含名称空间中文件的所有块。名称空间卷彼此独立(在映像中,它们对每个名称节点都是独立的,没有共享),这意味着名称节点之间不通信,而且一个名称节点的故障不会影响其他名称节点管理的名称空间的可用性。块池存储没有分区(因此在映像中的所有节点之间共享),因此datanodes向集群中的每个namenode注册(再次与所有namenodes共享),并存储来自多个块池的块(我的问题是,我们如何拥有多个块池?整段不是总结了所有名称节点都有指向每个块的元数据,因此共享一个块池吗?)。
我他妈的糊涂了!
3条答案
按热度按时间iyr7buue1#
关于“块池”矩形,您的表示不准确,应为“块池”。
我认为值得再看一次:
因此,基本上每个块池都是彼此独立管理的,每个块池都是属于单个命名空间的一组块。namenodes不会相互通信,这是有道理的。
从我所读到的内容来看,这背后的原因是允许命名空间为新块生成块id,而不需要与其他命名空间进行协调。namenode的故障不会阻止datanode为集群中的其他namenode提供服务。
vx6bjr1n2#
为了更清楚,如果上图中的namenodenn-n出现故障,pool-n也将不可用。因此,在恢复namenone nn-n之前,pool-n中维护的datanode块将不可访问。否则就发生了
dauxcl2d3#
我发现这很有用,它来自hadoop operations一书:
乍一看,联邦似乎与简单地拥有多个离散的集群没有什么不同,只是客户机插件将它们看作一个逻辑名称空间。然而,一个主要的区别因素是联邦集群中的每个datanode为每个namenode存储块。格式化每个namenode后,它将生成一个块池,其中存储与该namenode关联的块数据。每个datanode依次存储多个块池的数据,并与每个namenode通信。当namenode从datanode接收到心跳信号时,它将了解其他块池以及非hdfs数据所消耗的datanode上的总空间。让所有数据节点都参与到所有块池中而不是简单地拥有离散的集群的基本原理是,这样可以更好地利用数据节点的总容量。相反,如果我们完全为频繁使用的namenode a使用一组单独的datanodes,namenode b的datanodes将没有得到充分利用,而namenode a datanodes则难以跟上负载。