app
分布式
该值默认为false, 即不容许一个application同时存在一个以上的active SparkContext实例. 如何保证这一点呢?函数
this
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行代码 }
spa
经过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对象构造code
对象