当前位置 博文首页 > Shockang的博客:SparkConf 是什么?有什么作用?

    Shockang的博客:SparkConf 是什么?有什么作用?

    作者:[db:作者] 时间:2021-08-24 09:55

    前言

    本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

    本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

    正文

    为什么需要 SparkConf?

    任何优秀的软件或服务都会提供一些配置参数,这些配置参数有些是内置的,有些则是可以由用户配置的。

    对于熟悉 Java 的开发人员来说,对 JVM 进行性能调优是一个经常需要面对的工作,这个过程常常伴随着各种 JVM 参数的调整与测试。

    之所以将这些参数交给具体的开发人员去调整,是因为软件或服务的提供者也无法保证给定的默认参数是最符合用户应用场景与软硬件环境的。

    举一个简单的例子:当用户的 QPS 发生变化时,对于 Web 服务的 JVM 来说也应当相应调整内存的大小或限制。

    Spark 作为一款优秀的计算框架,也配备了各种各样的系统配置参数。

    SparkConf 是什么?

    SparkConf 是 Spark 的配置类,这个类在 Spark 的历史版本中已经存在很久了,Spark 中的每一个组件都直接或者间接地使用着它所存储的属性,这些属性都存储在如下的数据结构中。

    private val settings = new ConcurrentHashMap[String, String]()
    

    由以上代码的泛型可以看出, Spark 的所有配置,无论是 key 还是 value 都是 String 类型。

    Spark 的配置通过以下 3 种方式获取

    1. 来源于系统参数(即使用 System.getProperties 获取的属性)中以 spark. 作为前缀的那部分属性;
    2. 使用 SparkConf 的 API 进行设置;
    3. 从其他 SparkConf 中克隆。

    SparkConf 源码类注释 (3.2.0-SNAPSHOT)

    /**
     * Spark应用程序的配置。
     * 
     * 用于将各种Spark参数设置为键值对。 
     * 
     * 大多数情况下,使用 new SparkConf() 创建一个SparkConf对象,它也会从应用程序中设置的任何 spark.* 形式的 Java 系统属性来加载值。
     * 
     * 在这种情况下,直接在SparkConf对象上设置的参数优先于系统属性。 
     * 
     * 对于单元测试,可以调用 new SparkConf(false) 跳过加载外部设置并获得相同的配置,而不管系统属性是什么。 
     * 
     * 此类中的所有 setter 方法都支持链式语法。
     * 
     * 例如,可以编写 new SparkConf().setMaster(“local”).setAppName(“My app”)。 
     * 
     *
     * @param loadDefaults 是否从Java系统属性加载值
     *                     
     * @note 一旦SparkConf对象被传递给Spark,它就会被克隆,并且用户不能再修改它。Spark不支持在运行时修改配置。
     *       
     */
    class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable
    
    cs