ScriptBasedMapping.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.net;
  19. import java.util.*;
  20. import java.io.*;
  21. import org.apache.commons.logging.Log;
  22. import org.apache.commons.logging.LogFactory;
  23. import org.apache.hadoop.util.*;
  24. import org.apache.hadoop.util.Shell.ShellCommandExecutor;
  25. import org.apache.hadoop.conf.*;
  26. /**
  27.  * This class implements the {@link DNSToSwitchMapping} interface using a 
  28.  * script configured via topology.script.file.name .
  29.  */
  30. public final class ScriptBasedMapping extends CachedDNSToSwitchMapping 
  31. implements Configurable
  32. {
  33.   public ScriptBasedMapping() {
  34.     super(new RawScriptBasedMapping());
  35.   }
  36.   
  37.   // script must accept at least this many args
  38.   static final int MIN_ALLOWABLE_ARGS = 1;
  39.   
  40.   static final int DEFAULT_ARG_COUNT = 100;
  41.   
  42.   static final String SCRIPT_FILENAME_KEY = "topology.script.file.name";
  43.   static final String SCRIPT_ARG_COUNT_KEY = "topology.script.number.args";
  44.   
  45.   public ScriptBasedMapping(Configuration conf) {
  46.     this();
  47.     setConf(conf);
  48.   }
  49.   
  50.   public Configuration getConf() {
  51.     return ((RawScriptBasedMapping)rawMapping).getConf();
  52.   }
  53.   
  54.   public void setConf(Configuration conf) {
  55.     ((RawScriptBasedMapping)rawMapping).setConf(conf);
  56.   }
  57.   
  58.   private static final class RawScriptBasedMapping
  59.   implements DNSToSwitchMapping {
  60.   private String scriptName;
  61.   private Configuration conf;
  62.   private int maxArgs; //max hostnames per call of the script
  63.   private static Log LOG = 
  64.     LogFactory.getLog(ScriptBasedMapping.class);
  65.   public void setConf (Configuration conf) {
  66.     this.scriptName = conf.get(SCRIPT_FILENAME_KEY);
  67.     this.maxArgs = conf.getInt(SCRIPT_ARG_COUNT_KEY, DEFAULT_ARG_COUNT);
  68.     this.conf = conf;
  69.   }
  70.   public Configuration getConf () {
  71.     return conf;
  72.   }
  73.   
  74.   public RawScriptBasedMapping() {}
  75.   
  76.   public List<String> resolve(List<String> names) {
  77.     List <String> m = new ArrayList<String>(names.size());
  78.     
  79.     if (names.isEmpty()) {
  80.       return m;
  81.     }
  82.     if (scriptName == null) {
  83.       for (int i = 0; i < names.size(); i++) {
  84.         m.add(NetworkTopology.DEFAULT_RACK);
  85.       }
  86.       return m;
  87.     }
  88.     
  89.     String output = runResolveCommand(names);
  90.     if (output != null) {
  91.       StringTokenizer allSwitchInfo = new StringTokenizer(output);
  92.       while (allSwitchInfo.hasMoreTokens()) {
  93.         String switchInfo = allSwitchInfo.nextToken();
  94.         m.add(switchInfo);
  95.       }
  96.       
  97.       if (m.size() != names.size()) {
  98.         // invalid number of entries returned by the script
  99.         LOG.warn("Script " + scriptName + " returned "
  100.             + Integer.toString(m.size()) + " values when "
  101.             + Integer.toString(names.size()) + " were expected.");
  102.         return null;
  103.       }
  104.     } else {
  105.       // an error occurred. return null to signify this.
  106.       // (exn was already logged in runResolveCommand)
  107.       return null;
  108.     }
  109.     
  110.     return m;
  111.   }
  112.   
  113.   private String runResolveCommand(List<String> args) {
  114.     int loopCount = 0;
  115.     if (args.size() == 0) {
  116.       return null;
  117.     }
  118.     StringBuffer allOutput = new StringBuffer();
  119.     int numProcessed = 0;
  120.     if (maxArgs < MIN_ALLOWABLE_ARGS) {
  121.       LOG.warn("Invalid value " + Integer.toString(maxArgs)
  122.           + " for " + SCRIPT_ARG_COUNT_KEY + "; must be >= "
  123.           + Integer.toString(MIN_ALLOWABLE_ARGS));
  124.       return null;
  125.     }
  126.     
  127.     while (numProcessed != args.size()) {
  128.       int start = maxArgs * loopCount;
  129.       List <String> cmdList = new ArrayList<String>();
  130.       cmdList.add(scriptName);
  131.       for (numProcessed = start; numProcessed < (start + maxArgs) && 
  132.            numProcessed < args.size(); numProcessed++) {
  133.         cmdList.add(args.get(numProcessed)); 
  134.       }
  135.       File dir = null;
  136.       String userDir;
  137.       if ((userDir = System.getProperty("user.dir")) != null) {
  138.         dir = new File(userDir);
  139.       }
  140.       ShellCommandExecutor s = new ShellCommandExecutor(
  141.                                    cmdList.toArray(new String[0]), dir);
  142.       try {
  143.         s.execute();
  144.         allOutput.append(s.getOutput() + " ");
  145.       } catch (Exception e) {
  146.         LOG.warn(StringUtils.stringifyException(e));
  147.         return null;
  148.       }
  149.       loopCount++; 
  150.     }
  151.     return allOutput.toString();
  152.   }
  153.   }
  154. }