来自getOrCreate
课程的SparkContext
方法的目的是什么?我不明白何时应该使用这种方法。
如果我有2个使用spark-submit
运行的spark应用程序,并且在main方法中我使用SparkContext.getOrCreate
实例化spark上下文,那么这两个应用程序将具有相同的上下文?
或者目的更简单,唯一的目的是当我创建一个spark应用程序时,我不想将spark上下文作为参数发送给方法,我将把它作为一个单例对象?
答案 0 :(得分:1)
如果我有两个使用spark-submit运行的spark应用程序,并且在main方法中我使用SparkContext.getOrCreate实例化spark上下文,那么这两个应用程序将具有相同的上下文?
不,SparkContext是一个本地对象。它不在应用程序之间共享。
当我创建一个spark应用程序时,我不想将spark上下文作为参数发送给方法,我会将其作为单例对象获取?
这正是原因所在。 SparkContext
(或SparkSession
)在Spark应用程序和Spark的核心源代码中无处不在,传递它们会带来巨大的负担。
对于任意线程可以初始化上下文的多线程应用程序也很有用。
关于docs:
is function可用于获取或实例化SparkContext并将其注册为单例对象。因为每个JVM只能有一个活动的SparkContext,所以当应用程序可能希望共享SparkContext时,这很有用。
驱动程序在自己的JVM中运行,没有内置机制可以在多个成熟的Java应用程序之间共享它(正确的应用程序执行自己的main
。检查Is there one JVM per Java application?和{{3}相关的一般问题)。应用程序是指"逻辑应用程序"多个模块执行自己的代码的地方 - SparkJob
上的一个例子是spark-jobserver
。此方案与将SparkContext
传递给函数没有什么不同。