至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的ip地址正确的映射到相应的机架上去。一个简单的实现如下:
#!/usr/bin/Python
#-*-coding:UTF-8 -*-
import sys
rack = {"hadoopnode-176.tj":"rack1",
"hadoopnode-178.tj":"rack1",
"hadoopnode-179.tj":"rack1",
"hadoopnode-180.tj":"rack1",
"hadoopnode-186.tj":"rack2",
"hadoopnode-187.tj":"rack2",
"hadoopnode-188.tj":"rack2",
"hadoopnode-190.tj":"rack2",
"192.168.1.15":"rack1",
"192.168.1.17":"rack1",
"192.168.1.18":"rack1",
"192.168.1.19":"rack1",
"192.168.1.25":"rack2",
"192.168.1.26":"rack2",
"192.168.1.27":"rack2",
"192.168.1.29":"rack2",
}
if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")
由于没有找到确切的文档说明 到底是主机名还是ip地址会被传入到脚本,所以在脚本中最好兼容主机名和ip地址,如果机房架构比较复杂的话,脚本可以返回如:/dc1/rack1 类似的字符串。
二 读取数据
我们看一下Hadoop集群配置中如何读取数据。当对某个文件的某个block进行读取的时候,hadoop采取的策略也是一样:
1.首先得到这个block所在的datanode的列表,有几个副本数该列表就有几个datanode。
2.根据列表中datanode距离读取端的距离进行从小到大的排序:
a)首先查找本地是否存在该block的副本,如果存在,则将本地datanode作为第一个读取该block的datanode
b)然后查找本地的同一个rack下是否有保存了该block副本的datanode
c)最后如果都没有找到,或者读取数据的node本身不是datanode节点,则返回datanode列表的一个随机顺序。
--------------------------------------分割线 --------------------------------------
Hadoop: The Definitive Guide【PDF版】
--------------------------------------分割线 --------------------------------------