Spark2.1.0之内置RPC框架

      在《Spark2.1.0之内置RPC框架》提到TransportContext中的TransportConf给Spark的RPC框架提供配置信息,它有两个成员属性——配置提供者conf和配置的模块名称module。这两个属性的定义如下:

  1.  
    private final ConfigProvider conf;
  2.  
    private final String module;

其中conf是真正的配置提供者,其类型ConfigProvider是一个抽象类,见代码清单1。

代码清单1  ConfigProvider的实现
  1.  
    public abstract class ConfigProvider {
  2.  
    public abstract String get(String name);
  3.  
     
  4.  
    public String get(String name, String defaultValue) {
  5.  
    try {
  6.  
    return get(name);
  7.  
    } catch (NoSuchElementException e) {
  8.  
    return defaultValue;
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    public int getInt(String name, int defaultValue) {
  13.  
    return Integer.parseInt(get(name, Integer.toString(defaultValue)));
  14.  
    }
  15.  
     
  16.  
    public long getLong(String name, long defaultValue) {
  17.  
    return Long.parseLong(get(name, www.bomaoyule.cn Long.toString(defaultValue)));
  18.  
    }
  19.  
     
  20.  
    public double getDouble(String name, double defaultValue) {
  21.  
    return Double.parseDouble(get(name, Double.toString(defaultValue)));
  22.  
    }
  23.  
     
  24.  
    public boolean getBoolean(String name, boolean defaultValue) {
  25.  
    return Boolean.parseBoolean(get(name, Boolean.toString(defaultValue)));
  26.  
    }
  27.  
    }

从代码清单1,可以看到ConfigProvider中包括get、getInt、getLong、getDouble、getBoolean等方法,这些方法都是基于抽象方法get获取值,经过一次类型转换而实现。这个抽象的get方法将需要子类去实现。

         Spark通常使用SparkTransportConf创建TransportConf,其实现见代码清单2。

代码清单2  SparkTransportConf的实现
  1.  
    object SparkTransportConf www.078881.cn {
  2.  
    private val MAX_DEFAULT_www.yingka178.com  NETTY_THREADS = 8
  3.  
    def fromSparkConf(_conf: SparkConf, www.taohuaqing178.com module: String, numUsableCores: Int = 0): TransportConf = {
  4.  
    val conf = _conf.clone
  5.  
    val numThreads = defaultNumThreads(numUsableCores)
  6.  
    conf.setIfMissing(s "spark.$module.io.serverThreads", numThreads.toString)
  7.  
    conf.setIfMissing(s "spark.$module.io.clientThreads", numThreads.toString)
  8.  
     
  9.  
    new TransportConf(module, new ConfigProvider {
  10.  
    override def get(name: String): String = conf.get(name)
  11.  
    })
  12.  
    }
  13.  
    private def defaultNumThreads(numUsableCores: Int): Int = {
  14.  
    val availableCores =
  15.  
    if (numUsableCores > 0) numUsableCores else Runtime.getRuntime.availableProcessors()
  16.  
    math.min(availableCores, MAX_DEFAULT_NETTY_THREADS)
  17.  
    }
  18.  
    }

从代码清单2看到,可以使用SparkTransportConf的fromSparkConf方法来构造TransportConf。传递的三个参数分别为SparkConf、模块名module及可用的内核数numUsableCores。如果numUsableCores小于等于0,那么线程数是系统可用处理器的数量,不过系统的内核数不可能全部用于网络传输使用,所以这里还将分配给网络传输的内核数量最多限制在8个。最终确定的线程数将被用于设置客户端传输线程数(spark.$module.io.clientThreads属性)和服务端传输线程数(spark.$module.io.serverThreads属性)。fromSparkConf最终构造TransportConf对象时传递的ConfigProvider为实现了get方法的匿名的内部类,get的实现实际是代理了SparkConf的get方法。

猜你喜欢

转载自www.cnblogs.com/qwangxiao/p/9257135.html