有奖:语音产品征文挑战赛火热进行中> HOT

机架感知概述

Hadoop 集群机架感知是指 Hadoop 分布式计算框架中的节点会根据网络拓扑结构进行组织,并且在任务调度和数据存储时将优先发生在同一机架内的节点之间,以提高集群性能和可靠性的技术。 它是由 HDFS 和 YARN 两个组件来支持的。HDFS 通过将数据块的副本分布在不同的机架上,实现数据的高可靠性和高可用性。YARN 则通过将任务分配到距离更近的节点或容器上,提高任务执行的效率和性能。 而 Hadoop 无法自动发现节点的网络拓扑结构,所以提供了以下方式帮助其感知:
自定义 Java 类实现 DNSToSwitchMapping 的接口方法,并在 core-site.xml 配置文件中由 net.topology.node.switch.mapping.impl 参数指定类名。
基于脚本进行拓扑映射,并在 core-site.xml 配置文件中使用 net.topology.script.file.name 参数指定。
下面提供了基于脚本配置机架感知策略的示例,基本方法是映射可用区子网到机架信息。
说明
机架感知搭建需基于集群为跨可用区部署架构(集群创建请参见 跨可用区集群部署),单可用区集群不适用。

基于脚本配置机架感知策略

1. 准备一个跨可用区的 EMR 集群,登录 EMR 控制台,单击集群 ID/名称进入集群详情页,在实例信息 > 部署信息中确认集群所在的 VPC 网络信息和不同可用区对应的子网。

然后在私有网络 > 子网中获取子网的 CIDR 与可用区的映射信息。
注意
VPC 名称和子网名称均可能存在重复情况,此时需进入集群资源下的实例信息进一步确认。

2. 根据子网 CIDR 与可用区的映射信息,准备机架感知脚本 RackAware.py。
说明:
本为使用 /usr/bin/python 路径下的 python2 版本为示例,其中 #CIDR# 需替换为子网 CIDR。
#!/usr/bin/python

import sys
import IPy
import re

DEFAULT_RACK="/default-rack"
cidrToRack = {
' #CIDR#' : 'rack-1',
' #CIDR#' : 'rack-2',
' #CIDR#' : 'rack-3'
}

for name in sys.argv[1:]:
rack = DEFAULT_RACK
ips = re.findall(r'[0-9]+(?:\\.[0-9]+){3}', name)
if len(name) > 0 and len(ips) > 0:
ip = ips[0]
for cidr in cidrToRack.keys():
if ip in IPy.IP(cidr):
rack = cidrToRack[cidr]
break
print "/{0}".format(rack)

3. 集群服务> HDFS > 配置管理中,新增 RackAware.py 文件,并在 NameNode 节 点core-site.xml 文件增加配置项net.topology.script.file.name=/usr/local/service/hadoop/etc/hadoop/RackAware.py


4. 控制台重启 NameNode和ResourceManager。

查看集群的机架信息

HDFS 服务:登录 NameNode 节点,hadoop 用户执行 hdfs dfsadmin -printTopology,如下:

YARN 服务:可登录 WebUI 查看: