创建spark driver端执行环境SparkEnv
- 1.过程分析
-
- 1.1.入口
- 1.2.createDriverEnv 构建driver端执行环境
-
- 1.2.1.driver端executor id
- 1.2.2.执行环境sparkEnv的属性
- 1.2.3.create 执行环境构建的底层逻辑
-
- 1.2.3.1.driver端判断
- 1.2.3.2.securityManage安全管理器初始化
- 1.2.3.3.rpcEnv 初始化
- 1.2.3.4.spark.serializer参数指定序列化器初始化
- 1.2.3.5.serializerManager 序列化管理器初始化
- 1.2.3.6.java序列化器初始化
- 1.2.3.7.broadcastManager 广播管理器初始化
- 1.2.3.8.mapOutputTracker Map任务输出跟踪器初始化
- 1.2.3.9.shuffleManager初始化
- 1.2.3.10.useLegacyMemoryManager 统一内存管理初始化
- 1.2.3.11.blockManager初始化
- 1.2.3.12.metricsSystem 指标管理系统初始化
- 1.2.3.13.outputCommitCoordinator 输出提交协调器初始化
- 1.2.3.14.driver端创建临时目录
- 2.参考资料
1.过程分析
1.1.入口
spark的driver端执行环境的创建在sparkContext的初始化过程中完成;
具体入口位置如下代码段所示:在sparkContext类的try catch代码块中;
调用链:try catch块 ->createSparkEnv方法->SparkEnv.createDriverEnv方法;
class SparkContext(config: SparkConf) extends Logging {
//无关代码省略...
//创建spark env调用方法
private[spark] def createSparkEnv(
conf: SparkConf,
isLocal: Boolean,
listenerBus: LiveListenerBus): SparkEnv = {
//指定driver端可以使用的cpu核数
SparkEnv.createDriverEnv(conf, isLocal, listenerBus, SparkContext.numDriverCores(master, conf))
}
//无关代码省略...
try {
//无关代码省略...
// Create the Spark execution environment (cache, map output tracker, etc)
//创建spark env入口
_env = createSparkEnv(_conf, isLocal, listenerBus)
SparkEnv.set(_env)
//无关代码省略...
} catch {
//无关代码省略...
}
}
1.1.1.driver端cpu核数指定
本地模式下:
没有指定线程数,设置默认值1
指定线程数,根据线程数设置值;
如果线程数为*号,根据jvm虚拟机可用cpu数量确定;
yarn集群模式下,根据spark.driver.cores参数确定,默认值0;
其他情况,默认值设0;
object SparkContext extends Logging {
private[spark] def numDriverCores(master: String, conf: SparkConf): Int = {
//String -> Int
def convertToInt(threads: String): Int = {
if (threads == "*") Runtime.getRuntime.availableProcessors() else threads.toInt
}
master match {
//本地模式,没指定情况下默认1
case "local" => 1
//本地模式指定线程数情况下,根据线程数确定
case SparkMasterRegex.LOCAL_N_REGEX(threads) => convertToInt(threads)
case SparkMasterRegex.LOCAL_N_FAILURES_REGEX(threads, _) => convertToInt(threads)
//yarn集群模式下,根据spark.driver.cores参数确定,默认值0
case "yarn" =>
if (conf != null && conf.getOption("spark.submit.deployMode").contains("cluster")) {
conf.getInt("spark.driver.cores", 0)
} else {
0
}
//driver没有使用或后面设置driver cpu核数情况下,默认值0
case _ =