hadoop 2.6.3 CachedDNSToSwitchMapping源代码分析

来源:互联网 发布:巨人网络招聘2017 编辑:程序博客网 时间:2024/05/01 21:43

CachedDNSToSwitchMapping的作用是对已经解析了的ip地址和rack的地址的映射进行缓冲。

/** * A cached implementation of DNSToSwitchMapping that takes an * raw DNSToSwitchMapping and stores the resolved network location in  * a cache. The following calls to a resolved network location * will get its location from the cache.  * */
里面有两个变量,cache用来存储ip地址和network location的地址的映射,第二个用来对未缓冲的ip 地址进行解析。

  private Map<String, String> cache = new ConcurrentHashMap<String, String>();  /**   * The uncached mapping   */  protected final DNSToSwitchMapping rawMapping;

在resolve,没有缓冲的ip,调用rawMapping.resolve方法来解析它的networklocation.

 @Override  public List<String> resolve(List<String> names) {    // normalize all input names to be in the form of IP addresses    names = NetUtils.normalizeHostNames(names);    List <String> result = new ArrayList<String>(names.size());    if (names.isEmpty()) {      return result;    }    List<String> uncachedHosts = getUncachedHosts(names);    // Resolve the uncached hosts    List<String> resolvedHosts = rawMapping.resolve(uncachedHosts);    //cache them    cacheResolvedHosts(uncachedHosts, resolvedHosts);    //now look up the entire list in the cache    return getCachedHosts(names);  }
getUncachedHosts,判断ip是否在缓冲里。
  /**   * @param names a list of hostnames to probe for being cached   * @return the hosts from 'names' that have not been cached previously   */  private List<String> getUncachedHosts(List<String> names) {    // find out all names without cached resolved location    List<String> unCachedHosts = new ArrayList<String>(names.size());    for (String name : names) {      if (cache.get(name) == null) {        unCachedHosts.add(name);      }     }    return unCachedHosts;  }
cacheResolvedHosts对新解析的ip和networklocation进行缓冲,两个list的大小必须相等。
 /**   * Caches the resolved host:rack mappings. The two list   * parameters must be of equal size.   *   * @param uncachedHosts a list of hosts that were uncached   * @param resolvedHosts a list of resolved host entries where the element   * at index(i) is the resolved value for the entry in uncachedHosts[i]   */  private void cacheResolvedHosts(List<String> uncachedHosts,       List<String> resolvedHosts) {    // Cache the result    if (resolvedHosts != null) {      for (int i=0; i<uncachedHosts.size(); i++) {        cache.put(uncachedHosts.get(i), resolvedHosts.get(i));      }    }  }
其它的方法非常简单,如下:
/**   * Get the (host x switch) map.   * @return a copy of the cached map of hosts to rack   */  @Override  public Map<String, String> getSwitchMap() {    Map<String, String > switchMap = new HashMap<String, String>(cache);    return switchMap;  }  @Override  public String toString() {    return "cached switch mapping relaying to " + rawMapping;  }  /**   * Delegate the switch topology query to the raw mapping, via   * {@link AbstractDNSToSwitchMapping#isMappingSingleSwitch(DNSToSwitchMapping)}   * @return true iff the raw mapper is considered single-switch.   */  @Override  public boolean isSingleSwitch() {    return isMappingSingleSwitch(rawMapping);  }    @Override  public void reloadCachedMappings() {    cache.clear();  }  @Override  public void reloadCachedMappings(List<String> names) {    for (String name : names) {      cache.remove(name);    }  }





0 0