Spark内部如何保证每个application中只存在一个SparkContext?
该值默认为false, 即不允许一个application同时存在一个以上的active SparkContext实例. 如何保证这一点呢?
class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient {
//< 如果为true,有多个SparkContext处于active状态时记录warning日志而不是抛出异常.
private val allowMultipleContexts: Boolean =
config.getBoolean("spark.driver.allowMultipleContexts", false)
//< 此处省略n行代码
}
//< 注意: 这必须放在SparkContext构造器的最开始
SparkContext.markPartiallyConstructed(this, allowMultipleContexts)
private[spark] def markPartiallyConstructed(
sc: SparkContext,
allowMultipleContexts: Boolean): Unit = {
SPARK_CONTEXT_CONSTRUCTOR_LOCK.synchronized {
assertNoOtherContextIsRunning(sc, allowMultipleContexts)
contextBeingConstructed = Some(sc)
}
}
//< 伴生对象SparkContext包含一组实用的转换和参数来和各种Spark特性一起使用
object SparkContext extends Logging {
private val SPARK_CONTEXT_CONSTRUCTOR_LOCK = new Object()
//< 此处省略n行代码
}
-
通过SparkContext伴生对象object SparkContext中维护了一个对象
SPARK_CONTEXT_CONSTRUCTOR_LOCK, 单例SparkContext在一个进程中是唯一的, 所以SPARK_CONTEXT_CONSTRUCTOR_LOCK在一个进程中也是唯一的 -
函数markPartiallyConstructed中通过synchronized方法保证同一时间只有一个线程能处理
assertNoOtherContextIsRunning(sc, allowMultipleContexts)
contextBeingConstructed = Some(sc)assertNoOtherContextIsRunning会检测是否有其他SparkContext对象正在被构造或已经构造完成, 若allowMultipleContexts为true且确有正在或者已经完成构造的SparkContext对象, 则抛出异常, 否则完成SparkContext对象构造

浙公网安备 33010602011771号