在分布式集群下,由于机架的的槽位和交换机网口数量的限制,使得集群上的机器不得不跨越机架,通常一个大型的集群会跨越很多机架。一般情况机架内机器的通讯会快于跨机架机器之间的通讯,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。
通过机架感知,可以带来性能和安全性的提升,例如:HDFS块为了故障容错,采用机架感知按到一定的策略将某些块放置在不同的机架上,这样就算一个机架瘫痪也不会影响集群;运行MapReduce任务时,如果任务数量过多,每个任务运行的节点可能在不同的机架运行,这样任务可以就近获取到所需的HDFS块。
Hadoop守护进程通过获取配置文件中配置的外部脚本或Java类来获取集群slave的机架ID,使用Java类,需要实现org.apache.hadoop.net.DNSToSwitchMapping接口,这个接口期望用一一对应的方式用/myrack/myhost的格式保存网络拓扑结构的信息,“/”拓扑结构的分隔符,“myrack”的机架标识符,"myhost"是主机。例如:‘/192.168.100.0/192.168.100.5’ 作为一个机架-Host的拓扑映射。
额外的配置:mapreduce.jobtracker.taskcache.levels, 该参数定义在mapred-core.xml中,决定MapReduce缓存网络拓扑结构的层级,举例来说,如果它的值是2,则构建2个层级的缓存,一个 hosts (host -> task mapping) 和另一个racks (rack -> task mapping)。
NameNode是以主机为单位来计算集群的负载情况。以节点的话,如果某台主机上启动了多个DataNode节点,会造成这台主机的负载过重。
NameNode启动时,有两种方式存放DataNode:
1,org.apache.hadoop.hdfs.server.blockmanagement.Host2NodesMap
将DataNode和主机的对应关系存放到org.apache.hadoop.hdfs.server.blockmanagement.Host2NodesMap类中,该类主要对集群中的DataNode节点按照主机进行分类管理,包含contains(是否包含),add(添加),remove(删 除),getDatanodeByHost(根据IP地址获取DataNode),getDatanodeByXferAddr方法。
2,org.apache.hadoop.net.NetworkTopology(默认)
NetworkTopology类将整个集群的DataNode节点存储成一个树形的网络拓扑图,但是在NameNode节点把一个DataNode节点交给NetworkTopology时,要将DataNode节点解析成/myrack/myhost格式。
NameNode 节点要把IP地址解析成什么样的路径格式,这个是由用户指定的,用户可以在core-s