【问题标题】:How to implement a real Singleton in Scala如何在 Scala 中实现真正的 Singleton
【发布时间】: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


【解决方案1】:

您的代码过于复杂。如果“两个不同的工作”是不同的线程,那么你只需要:

object SparkContextLoader {

  val sparkConf = new SparkConf().setMaster("local[" + workers + "]").setAppName("SparkApp")

  val sc = new SparkContext(sparkConf)
}

然后您可以使用this question 的答案访问这些值。

如果“两个不同的工作”是不同的 java 应用程序,那么 it doesn't seem 有一种方法可以在它们之间共享一个单例。

【讨论】:

  • 你是对的。对 SparkContext 使用 var 而不是 val 是问题所在。我希望 scala 对象总是表现得像 Singleton,但显然不是这样。
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多