前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何保证一个Spark Application只有一个SparkContext实例

如何保证一个Spark Application只有一个SparkContext实例

作者头像
codingforfun
发布2018-08-24 13:52:12
6690
发布2018-08-24 13:52:12
举报
文章被收录于专栏:牛肉圆粉不加葱

Spark有个关于是否允许一个application存在多个SparkContext实例的配置项, 如下:

**spark.driver.allowMultipleContexts: ** If true, log warnings instead of throwing exceptions when multiple SparkContexts are active.

该值默认为false, 即不允许一个application同时存在一个以上的avtive SparkContext实例. 如何保证这一点呢?

在SparkContext构造函数最开始处获取是否允许存在多个SparkContext实例的标识allowMultipleContexts, 我们这里只讨论否的情况 ( 默认也是否, 即allowMultipleContexts为false )

代码语言:javascript
复制
class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient {

  //< 如果为true,有多个SparkContext处于active状态时记录warning日志而不是抛出异常.
  private val allowMultipleContexts: Boolean =
    config.getBoolean("spark.driver.allowMultipleContexts", false)
    
    //< 此处省略n行代码
}
代码语言:javascript
复制
  //< 注意: 这必须放在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)
    }
  }
代码语言:javascript
复制
//< 伴生对象SparkContext包含一组实用的转换和参数来和各种Spark特性一起使用
object SparkContext extends Logging {
private val SPARK_CONTEXT_CONSTRUCTOR_LOCK = new Object()

//< 此处省略n行代码
}

结合以上三段代码, 可以看出保证一个Spark Application只有一个SparkContext实例的步骤如下:

  1. 通过SparkContext伴生对象object SparkContext中维护了一个对象 SPARK_CONTEXT_CONSTRUCTOR_LOCK, 单例SparkContext在一个进程中是唯一的, 所以SPARK_CONTEXT_CONSTRUCTOR_LOCK在一个进程中也是唯一的
  2. 函数markPartiallyConstructed中通过synchronized方法保证同一时间只有一个线程能处理 assertNoOtherContextIsRunning(sc, allowMultipleContexts) contextBeingConstructed = Some(sc)

assertNoOtherContextIsRunning会检测是否有其他SparkContext对象正在被构造或已经构造完成, 若allowMultipleContexts为true且确有正在或者已经完成构造的SparkContext对象, 则抛出异常, 否则完成SparkContext对象构造

看到这里, 有人可能会有疑问, 这虽然能保证在一个进程内只有唯一的SparkContext对象, 但Spark是分布式的, 是不是无法保证在在其他节点的进程内会构造SparkContext对象. 其实并不存在这样的问题, 因为SparkContext只会在Driver中得main函数中声明并初始化, 也就是说只会在Driver所在节点的一个进程内构造.


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015.06.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档