如何在Scala中实现一个真正的Singleton

问题描述 投票:1回答:1

我有混合Java / Scala项目。有一些Quartz作业用Java实现,并使用一些Scala类。这些类应该使用相同的SparkContext实例,所以我实现了一些应该是singleton的东西,如下所示:

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 scala apache-spark singleton
1个回答
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有一种方法可以在两者之间共享一个单例。

© www.soinside.com 2019 - 2024. All rights reserved.