我有混合的Java / Scala项目。有一些Quartz作业用Java实现,并使用一些Scala类。这些类应该使用相同的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对象的行为不像单身?
答案 0 :(得分:2)
您的代码过于复杂。如果“两个不同的工作”是不同的线程,那么您只需要:
object SparkContextLoader {
val sparkConf = new SparkConf().setMaster("local[" + workers + "]").setAppName("SparkApp")
val sc = new SparkContext(sparkConf)
}
然后,您可以使用this question的答案访问这些val。
如果“两个不同的工作”是不同的java应用程序,那么it doesn't seem有一种方法可以在两者之间共享一个单例。