如何在 Scala 中实现真正的 Singleton

Posted

技术标签:

【中文标题】如何在 Scala 中实现真正的 Singleton【英文标题】:How to implement a real Singleton in Scala 【发布时间】: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 How can I use a Scala singleton object in Java?的可能重复 @4e6 这不是重复的。如果您查看我的帖子,那是我没有使用 Java 中的 Scala 单例对象。 Java 作业创建一些 Scala 类的实例并在这些类上调用函数。这些 scala 类使用的 Scala 对象应该表现为 Singleton,即为整个应用程序返回一个 SparkContext 实例。 正如@heavyhorse 所建议的,问题是我使用 var 而不是 val 作为 SparkContext 【参考方案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,但显然不是这样。

以上是关于如何在 Scala 中实现真正的 Singleton的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala 中实现 Kafka Consumer

如何在 Scala 中实现 DAO?

您将如何在 Scala 中实现缓存方面

如何在 spark scala 中实现 uniqueConcatenate、uniqueCount [关闭]

如何在火花聚合函数中实现scala类型安全

Scala - 如何在 Spark 的 map 函数中实现 Try