spark源码分析之sparkconf

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyinthesky111/article/details/79379309

一.源码下载以及打开
下载源码时直接从spark官网去下载就行,这里附上地址http://mirrors.shu.edu.cn/apache/spark/spark-2.2.1/spark-2.2.1.tgz。源码从官网下载后保存到本地后解压,再用idea 打开解压后的文件就可以进行源码阅读了。
二.sparkconf源码分析
将spark源码在本地打开后,就可以开森的进行源码阅读了,下面就是本人一些简单的源码阅读的笔记,仅限于个人观点,自己实力有限,如有不对,还请及时指出,本人会及时更改。
2.1 源码注释阅读
咱们在打开源码后选择spark—core_2.11,然后下拉,双击打开sparkconf.scala文件。打开sparkconf文件后,咱们首先看一下作者给出的代码的注释
Configuration for a Spark application. Used to set various Spark parameters as key-value pairs.
这是注释的第一句,这句话言简意赅的告诉了我们sparkconf在spark程序中的作用,即它是spark程序中的参数,被应用于以key-value的形式创建一系列的spark的参数。
Most of the time, you would create a SparkConf object with new SparkConf(), which will loadvalues from anyspark.*Java system properties set in your application as well. In this case,parameters you set directly on theSparkConf` object take priority over system properties.
这句话又告诉我们了在我们new sparkconf()对象的时候,这个对象会干什么,它会加载任何以’spark.*’的值,还可以在你的程序中设置java相关的参数。而你自己设置的spark相关的参数会有限的覆盖系统默认的一些参数。
Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified by the user. Spark does not support modifying the configuration at runtime.
这句话有告诉我们在过去的sparkconf对象中,它可以被复制,但是用户不能修改,spark不支持在程序运行的时候修改参数。
2.2源码分析
看完了作者给的注释,我们得到了下面这些基本信息:1、sparkconf保存了一些spark程序运行需要的参数,而且是key-value形式;2、它会加载spark.*的值,我们还可以自己设置参数,自己设置参数后,就会覆盖系统的默认的参数;3、在程序运行的时候,我们不能去修改这些配置参数。
下面开始仔细的看源码了
程序开始有一段注释
Create a SparkConf that loads defaults from system properties and the classpath
这里说是创建一个sparkconf从系统配置文件中去加载默认的配置和类路径
下面定义了一个默认为true的this方法,这里的true值得是在创建sparkconf类的时候传的一个布尔值为true,即加载默认的配置为true
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {}
也就是说,这一部分的代码主要意义就是加载系统默认配置的代码
先构建了一个settings对象,这是一个HashMap,又定义了一个lazy的reader,接着判断,如果执行加载默认配置的话就会给这个loadFromSystemProperties传一个false值进去
接下来咱们再来看一看loadFromSystemProperties这个方法,它给出的解释就是加载任何以spark.*的系统配置文件
Load any spark.* system properties
他实现的逻辑就是通过遍历,不断的调用工具类的getSystemProperties方法去获取以”spark.”开始的配置文件,getSystemProperties这个方法也是通过key获取value
这里写图片描述
接着就进行判断,然后根据对应的情况抛出对应的异常情况
这里写图片描述
接着两个set方法,set entry的信息
再接着setMaster和setAppName、setJars(在对friendly友好版本中,是把jar包存放在一个数组中,scala中应该是以seq的形式存储)、setExecutorEnv等等set各种配置信息,把这些配置信息配置完成后,定义了一个注册kryo类,他把所有要序列化的类放在一个LinkedHashSet中,然后set到sparkconf中
这里写图片描述
相同的逻辑创建了registerAvroSchemas,这个目的主要是减少序列化的网络IO
好了,精力有限,先分享到这,希望大神们多多指点错误

猜你喜欢

转载自blog.csdn.net/flyinthesky111/article/details/79379309