大型Hadoop集群以机架的形式来组织的,同一个机架上不同节点间的网络状况比不同机架之间更为理想,默认情况下,hadoop的机架感知是没有被启用的。
所有的机器Hadoop都默认在同一个默认的 机架下,以名为”/default-rack”,这种情况下,任何一台datanode机器,不管物理上是否属于同一个机架,都
会被认为是在同一个机架下。
启动hadoop机架感知只需要在core-default.xml中加入net.topology.script.file.name属性配置
<property>
<name>net.topology.script.file.name</name>
<value>/home/sy/script.py</value>
</property>
这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为某台datanode机器的ip地址,而输
出的值通常为该ip地址对应的datanode所在的rack
/home/sy/script.pyimport sys
rack = {"dn177.tj":"rack1",
dn178.tj":"rack1",
dn179.tj":"rack1",
dn180.tj":"rack1",
dn186.tj":"rack2",
dn187.tj":"rack2",
dn188.tj":"rack2",
dn190.tj":"rack2",
"192.168.1.177":"rack1",
"192.168.1.178":"rack1",
"192.168.1.180":"rack1",
"192.168.1.186":"rack1",
"192.168.1.187":"rack2",
"192.168.1.188":"rack2",
"192.168.1.190":"rack2",
}
if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")
最好把主机名和ip都配上。
将脚本属性改为可执行 chmod a+x script.py
重启namenode,如果配置成功 namenode 启动日志中会输出:
org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.177:50010
网络拓扑机器之间的距离
distance(/D1/R1/H1,/D1/R1/H1)=0 相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2 同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4 同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6 不同IDC下的datanode
所有的机器Hadoop都默认在同一个默认的 机架下,以名为”/default-rack”,这种情况下,任何一台datanode机器,不管物理上是否属于同一个机架,都
会被认为是在同一个机架下。
启动hadoop机架感知只需要在core-default.xml中加入net.topology.script.file.name属性配置
<property>
<name>net.topology.script.file.name</name>
<value>/home/sy/script.py</value>
</property>
这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为某台datanode机器的ip地址,而输
出的值通常为该ip地址对应的datanode所在的rack
/home/sy/script.pyimport sys
rack = {"dn177.tj":"rack1",
dn178.tj":"rack1",
dn179.tj":"rack1",
dn180.tj":"rack1",
dn186.tj":"rack2",
dn187.tj":"rack2",
dn188.tj":"rack2",
dn190.tj":"rack2",
"192.168.1.177":"rack1",
"192.168.1.178":"rack1",
"192.168.1.180":"rack1",
"192.168.1.186":"rack1",
"192.168.1.187":"rack2",
"192.168.1.188":"rack2",
"192.168.1.190":"rack2",
}
if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")
最好把主机名和ip都配上。
将脚本属性改为可执行 chmod a+x script.py
重启namenode,如果配置成功 namenode 启动日志中会输出:
org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.177:50010
(如果机架比较复杂,机架上边还有交换机,可把"192.168.1.190":"rack2",改为"192.168.1.190":"/switch1/rack2",本人猜测,还没实践。)
使用CDH的的话,配置机架有两种方法:
1.就是上边说的配置net.topology.script.file.name属性,
2.就是配置CM主页中的主机中的分配
网络拓扑机器之间的距离
有了机架感知,NameNode就可以画出上图所示的datanode网络拓扑图。
D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台datanode之间的距离。
distance(/D1/R1/H1,/D1/R1/H1)=0 相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2 同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4 同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6 不同IDC下的datanode