2.4.2 定义集群拓扑

在实际应用中,为了使Hadoop集群获得更高的性能,读者需要配置集群,使Hadoop能够感知其所在的网络拓扑结构。当然,如果集群中机器数量很少且存在于一个机架中,那么就不用做太多额外的工作;而当集群中存在多个机架时,就要使Hadoop清晰地知道每台机器所在的机架。随后,在处理MapReduce任务时,Hadoop就会优先选择在机架内部做数据传输,而不是在机架间传输,这样就可以更充分地使用网络带宽资源。同时,HDFS可以更加智能地部署数据副本,并在性能和可靠性间找到最优的平衡。

在Hadoop中,网络的拓扑结构、机器节点及机架的网络位置定位都是通过树结构来描述的。通过树结构来确定节点间的距离,这个距离是Hadoop做决策判断时的参考因素。NameNode也是通过这个距离来决定应该把数据副本放到哪里的。当一个Map任务到达时,它会被分配到一个TaskTracker上运行,JobTracker节点则会使用网络位置来确定Map任务执行的机器节点。

在图2-3中,笔者使用树结构来描述网络拓扑结构,主要包括两个网络位置:交换机/机架1和交换机/机架2。因为图2-3中的集群只有一个最高级别的交换机,所以此网络拓扑可简化描述为/机架1和/机架2。

在配置Hadoop时,Hadoop会确定节点地址和其网络位置的映射,此映射在代码中通过Java接口DNSToSwitchMaping实现,代码如下:


public interface DNSToSwitchMapping{

public List<String>resolve(List<String>names);

}


其中参数names是IP地址的一个List数据,这个函数的返回值为对应网络位置的字符串列表。在opology.node.switch.mapping.impl中的配置参数定义了一个DNSToSwitchMaping接口的实现,NameNode通过它确定完成任务的机器节点所在的网络位置。

在图2-3的实例中,可以将节点1、节点2、节点3映射到/机架1中,节点4、节点5、节点6映射到/机架2中。事实上在实际应用中,管理员可能不需要手动做额外的工作去配置这些映射关系,系统有一个默认的接口实现ScriptBasedMapping。它可以运行用户自定义的一个脚本区完成映射。如果用户没有定义映射,它会将所有的机器节点映射到一个单独的网络位置中默认的机架上;如果用户定义了映射,那么这个脚本的位置由topology.script.file.name的属性控制。脚本必须获取一批主机的IP地址作为参数进行映射,同时生成一个标准的网络位置给输出。