了解hadoop的或多或少都听说过机架感知策略,无论是balancer还是jobtracker分配作业、数据副本放置策略都会用到机架感知。那什么叫机架感知?
首先故名思意机架感知就是感知机架,谁感知?就是hadoop系统嘛,更确切地说是hadoop能在系统内部建立一套服务器和机架的位置拓扑图,并且能识别系统节点的拓扑位置,知道了这些,才能做副本放置策略、作业本地化等更高层的设计。
难道说hadoop系统能自动感应集群或者机房内部的网路拓扑结构?想想看,各个公司的机房拓扑或者网络结构都不一样,采用的设备类型也不相同,hadoop真的那么吊能感受到?显然不能!hadoop系统想获得这个网络拓扑结构,需要系统管理员的帮助。
试想一下,hadoop能构建一幅网络拓扑图,实际的网络拓扑图又千变万化,管理员该怎么弄?所以这时候hadoop有必要设计一抽象的拓扑图结构,管理员需要让实际的网络拓扑结构尽量地与之适配。
Namenode的大管家FSNamesystem有两个重要的成员:
NetworkTopology clusterMap = new NetworkTopology();
private DNSToSwitchMapping dnsToSwitchMapping;
这两个东西就负责构建了机架及机架感知。
首先说拓扑逻辑类 NetworkTopology clusterMap = new NetworkTopology();这个NetworkTopology构造函数就搞了一把锁就完事了:
public NetworkTopology() {
netlock = new ReentrantReadWriteLock();
}
从构造函数里似乎看不出来啥东西。我看查看这个clusterMap对象,会发现很多地方调用它的add、remove等操作,也许从这里可以看清楚这个网络拓扑类的面貌:
public void add(Node node) {
if (node==null) return;
if( node instanceof InnerNode ) {
throw new IllegalArgumentException(
"Not allow to add an inner node: "+NodeBase.getPath(node));
}
netlock.writeLock().lock();
try {
Node rack = getNode(node.getNetworkL