Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

Hadoop组件可识别机架。例如,通过将一个块副本放置在不同的机架上,HDFS块放置将利用机架感知来实现容错。如果网络交换机发生故障或集群中存在分区,这将提供数据可用性。

Hadoop主守护程序通过调用配置文件指定的外部脚本或Java类来获取集群工作器的机架ID。使用Java类或外部脚本进行拓扑构建,输出必须遵守java org.apache.hadoop.net.DNSToSwitchMapping接口。接口期望保持一对一的对应关系,并且拓扑信息的格式为“ / myrack / myhost”,其中“ /”是拓扑分隔符,“ myrack”是机架标识符,“ myhost”是个别主机。假设每个机架有一个/ 24子网,则可以使用“ /192.168.100.0/192.168.100.5”的格式作为唯一的机架主机拓扑映射。

要将Java类用于拓扑映射,该类名称由配置文件中的net.topology.node.switch.mapping.impl参数指定。hadoop发行版中包含一个示例NetworkTopology.java,可由Hadoop管理员自定义。使用Java类而不是外部脚本具有性能优势,因为当新的工作程序节点注册自身时,Hadoop不需要派生外部进程。

如果实现外部脚本,则将在配置文件中使用net.topology.script.file.name参数指定它。与java类不同,Hadoop分发版不包含外部拓扑脚本,而是由管理员提供的。派生拓扑脚本时,Hadoop将向ARGV发送多个IP地址。发送到拓扑脚本的IP地址数量由net.topology.script.number.args控制,默认为100。如果将net.topology.script.number.args更改为1,则每个拓扑脚本都会被派生由DataNodes和/或NodeManagers提交的IP。

如果未设置net.topology.script.file.namenet.topology.node.switch.mapping.impl,则为任何传递的IP地址返回机架ID'/ default-rack'。尽管此行为似乎是合乎需要的,但它可能导致HDFS块复制出现问题,因为默认行为是在机架上写入一个复制的块,并且由于只有一个名为'/ default-rack'的机架而无法这样做。

python示例

#!/ usr / bin / python
#此脚本对物理环境进行了假设。
#1)每个机架都是其自己的带有/ 24子网的第3层网络,其中
#在每个机架都有自己的地方可能是典型的
#使用上行链路切换到中央核心路由器。
#
#+ ----------- +
#|核心路由器|
#+ ----------- +
#/ \
#+ ----------- + + ----------- +
#|机架开关| |机架开关|
#+ ----------- + + ----------- +
#| 数据节点| | 数据节点|
#+ ----------- + + ----------- +
#| 数据节点| | 数据节点|
#+ ----------- + + ----------- +
#
#2)拓扑脚本获取IP列表作为输入,计算网络地址,并输出'/ network_address / ip'。

导入netaddr
导入系统
sys.argv.pop(0)#丢弃argv列表中拓扑脚本的名称,因为我们只需要IP地址

netmask ='255.255.255.0'#将netmask设置为您的环境中正在使用的内容。该示例使用/ 24

sys.argv中的ip:#循环遍历datanode IP的列表
    address ='{0} / {1}'。format(ip,netmask)#格式化地址字符串,因此看起来像'ip / netmask'才能使netaddr工作
    尝试:
        network_address = netaddr.IPNetwork(address).network#计算并打印网络地址
        打印“ / {0}”。格式(网络地址)
    除了:
        打印“ / rack-unknown”#如果无法计算网络地址,则打印所有值

bash示例

#!/ usr / bin / env bash
#这是一个bash示例,显示这些脚本可以多么简单
#假设我们在一个交换机上拥有所有设备的扁平网络,那么我们可以伪造一个机架拓扑。
#这可能发生在节点数量有限的实验室环境中,例如非托管交换机上的2-8台物理计算机。
#这也可能适用于在同一物理硬件上运行的多个虚拟机。
#机器的数量并不重要,但是我们试图在没有机器的情况下伪造一个网络拓扑。
#
#+ ---------- + + -------- +
#| jobtracker | | datanode |
#+ ---------- + + -------- +
#\ /
#+ -------- + + -------- + + -------- +
#| datanode |-| 开关|-| datanode |
#+ -------- + + -------- + + -------- +
#/ \
#+ -------- + + -------- +
#| datanode | | namenode |
#+ -------- + + -------- +
#
#通过这种网络拓扑,我们将每台主机视为一个机架。这是通过获取最后一个八位位组来完成的
#在数据节点的IP中,并以单词'/ rack-'开头。这样做的好处是HDFS
#可以创建其“机架外”块副本。
#1)'echo $ @'将所有ARGV值回显到xargs。
#2)'xargs'将强制我们每行打印一个argv值
#3)'awk'将在点上分割字段,并将最后一个字段追加到字符串'/ rack-'。如果awk
#无法分割成四个点,它仍将打印'/ rack-'最后一个字段值

回声$ @ | xargs -n 1 | awk -F'。'{print“ / rack-” $ NF}'