SparkContext.getOrCreate() purpose
SparkContext类中的getOrCreate方法的目的是什么? 我不知道何时应使用此方法。
如果我有2个使用spark-submit运行的spark应用程序,并且在main方法中使用SparkContext.getOrCreate实例化spark上下文,那么两个应用程序将具有相同的上下文吗?
还是目的更简单,唯一的目的是当我创建一个spark应用程序时,并且我不想将spark上下文作为参数发送给方法,而是将其作为单例对象来获得?
If I have 2 spark applications that are run with spark-submit, and in the main method I instantiate the spark context with SparkContext.getOrCreate, both app will have the same context?
不,SparkContext是本地对象。 应用程序之间不共享它。
when I create a spark app, and I don't want to send the spark context as a parameter to a method, and I will get it as a singleton object?
这正是原因。 SparkContext(或SparkSession)在Spark应用程序和核心Spark的源代码中无处不在,而将它们传递出去将带来巨大的负担。
对于任意线程可以初始化上下文的多线程应用程序,它也很有用。
关于文档:
is function may be used to get or instantiate a SparkContext and register it as a singleton object. Because we can only have one active SparkContext per JVM, this is useful when applications may wish to share a SparkContext.
驱动程序在自己的JVM中运行,并且没有内置的机制可在多个成熟的Java应用程序之间共享它(正确的应用程序执行自己的main。检查每个Java应用程序是否有一个JVM?为什么每个应用程序都有一个JVM? ?有关一般性问题)。 应用程序是指"逻辑应用程序",其中多个模块执行自己的代码-一个示例是spark-jobserver上的SparkJob。 这种情况与将SparkContext传递给函数没有什么不同。
-
根据文档,您的第一点是不正确的:此函数可用于获取或实例化SparkContext并将其注册为单例对象。因为每个JVM我们只能有一个活动的SparkContext,所以这在应用程序希望共享SparkContext时很有用。
-
@杰里米这是不正确的。通常情况下,每个JVM仅可以有一个应用程序(是否有Spark应用程序)-每个Java应用程序是否只有一个JVM?为什么每个应用程序只有一个JVM?
-
我是在回应您的声明,"应用程序之间不共享"。使用getOrCreate()共享SparkContext。如果尚不存在,则创建SparkContext;如果已存在,则创建SparkContext的实例。这是来自Apache Spark的相关描述
-
@Jeremy而且,您不能在应用程序中共享上下文(严格意义上),也不能共享JVM。您指的是在应用程序内部共享上下文。
-
你们两个在谈论同样的问题。我认为文档中的"应用程序"一词使用错误。因为,如果在许多应用程序之间共享spark上下文,则如果这些应用程序之一决定关闭自身,则所有应用程序将被关闭,因为它们具有相同的sparkcontext。另一方面,实例化相同上下文时由spark编写的日志(使用现有SparkContext的某些配置可能不会生效)非常令人困惑,因为如果我使用该方法只是不发送对象,这是没有意义的作为参数。
-
@Cosmin实际上有共享SparkContext的平台(jobserver是最知名的平台),但是在这种情况下,您不会提交功能齐全的应用程序(带有main等)。 SparkContext可以初始化一次,并且其核心配置(sql或Hadoop配置是另一回事)不能被修改,一旦初始化-这就是为什么您会收到警告的原因。
-
好的,作业服务器是共享的sparkcontext平台,因为它在同一JVM上运行,或者通常这些作业在同一spark上下文上运行,但是运行在我所知的不同线程上。这就是我们将jobserver命名为共享sparkcontext平台的原因,对吗?