机架感知功能属于Hadoop的数据存储策略功能。
由于在默认情况下Hadoop认为所有的datanode处于同一机架/default-rack
中。如果Hadoop集群是跨多个机架或者多个IDC机房,那么数据访问的成本会由于过多的网络传输会增加。
当Hadoop启动机架感知功能后,Hadoop的副本会按照如下策略存放(以3副本为例):
- 第一个副本存储在client相同的datanode上。(如果数据请求来至于集群外部,那么存储在一个低负载的一个datanode上)。
- 第二个副本存储在与第一个副本不同的rack的datanode上。
- 第三个副本存储在另外一个副本相同的rack的datanode上。
- 如果还有更多的副本,那么继续从集群中随机挑选data node存储
机架感知功能需要在NameNode
的hadoop-site.xml
中配置如下属性:1
2
3
4<property>
<name>topology.script.file.name</name>
<value>/path/to/script</value>
</property>
其中value
指向一个脚本,该脚本的入参是某一个DataNode的ip地址,该脚本返该ip地址对应的rack名称。当namenode接收到datanode的heartbeat后会调用该脚本进行查询,然后将datanode的ip地址与rack名称保存在一个map中。
Hadoop官方已经给出了该脚本的代码,参考:https://wiki.apache.org/hadoop/topology_rack_awareness_scripts
除了调用上述的shell脚本外,也可以调用python脚本,如下:
https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/RackAwareness.html
如果需要也可以是java程序,如果是java程序,那么需要设置net.topology.node.switch.mapping.impl
属性。