【发布时间】:2016-01-10 06:09:21
【问题描述】:
我有混合 Java/Scala 项目。有一些用 Java 实现并使用一些 Scala 类的 Quartz 作业。这些类应该使用相同的 SparkContext 实例,所以我实现了一些应该是单例的,看起来像这样:
object SparkContextLoader {
var hasSC = false
var sc:Any = 0
def getSC(workers):SparkContext={
if (!hasSC) {
val sparkConf = new SparkConf().setMaster("local[" + workers + "]").setAppName("SparkApp")
sc = new SparkContext(sparkConf)
hasSC = true
}
return sc.asInstanceOf[SparkContext]
}
从两个不同的作业调用 SparkContextLoader 总是会创建一个新的 SparkContext 实例,这是不允许的。
为什么 Scala 对象的行为不像单例?
【问题讨论】:
-
您的石英作业是用 java 编写的吗?您是否回顾了如何在 java 代码中引用 scala 对象?
-
你也在使用 var 而不是 SparkContext 的 val
-
@4e6 这不是重复的。如果您查看我的帖子,那是我没有使用 Java 中的 Scala 单例对象。 Java 作业创建一些 Scala 类的实例并在这些类上调用函数。这些 scala 类使用的 Scala 对象应该表现为 Singleton,即为整个应用程序返回一个 SparkContext 实例。
-
正如@heavyhorse 所建议的,问题是我使用 var 而不是 val 作为 SparkContext
标签: java scala apache-spark singleton