2016-01-10 34 views
1

我已经混合了Java/Scala项目。有在Java中实现的Quartz作业,并使用一些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对象不像单身人士?

+0

是用java写的石英作业吗?您是否回顾了如何在java代码中引用scala对象? – heavyhorse

+1

同样你使用var而不是val来代替SparkContext – heavyhorse

+2

可能的重复[如何在Java中使用Scala单例对象?](http://stackoverflow.com/questions/12284028/how-cani-i-使用java中的一个单一对象的对象) – 4e6

回答

1

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

object SparkContextLoader { 

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

    val sc = new SparkContext(sparkConf) 
} 

您可以然后使用答案访问这些丘壑到this question

如果“两个不同的工作”是不同的Java应用程序,然后it doesn't seem有一种方法可以跨两者共享一个单身人士。

+0

您是对的。使用var而不是val为SparkContext是个问题。我预计scala对象总是表现得像Singleton,但事实并非如此。 –