重新加载时Playframework Spark设置异常

重新加载时Playframework Spark设置异常,playframework,apache-spark,Playframework,Apache Spark,游戏和火花都很棒。然而,我在组合它们时遇到了一些困难。Play提供了良好的重新编译机制。但是,不可能重新实例化spark上下文 如果我的代码中有一些错误/更改了一些代码并重新编译,我很遗憾会收到以下错误: ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, org.apache.spark.SparkException: Only one Spark

游戏和火花都很棒。然而,我在组合它们时遇到了一些困难。Play提供了良好的重新编译机制。但是,不可能重新实例化spark上下文

如果我的代码中有一些错误/更改了一些代码并重新编译,我很遗憾会收到以下错误:

ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, org.apache.spark.SparkException: Only one SparkContext may be running in this JVM (see SPARK-2243). To ignore this error, set spark.driver.allowMultipleContexts = true. The currently running SparkContext was created at:
org.apache.spark.SparkContext.<init>(SparkContext.scala:82)
controllers.Application.createSparkContext(Application.scala:38)
controllers.Application.<init>(Application.scala:35)
controllers.Application$$FastClassByGuice$$b5b6aa19.newInstance(<generated>)
ProvisionException:无法设置,请查看以下错误:
1) 注入构造函数org.apache.spark.SparkException时出错:此JVM中只能运行一个SparkContext(请参阅spark-2243)。要忽略此错误,请将spark.driver.allowMultipleContexts设置为true。当前运行的SparkContext是在以下位置创建的:
org.apache.spark.SparkContext(SparkContext.scala:82)
controllers.Application.createSparkContext(Application.scala:38)
控制器。应用。(应用。scala:35)
controllers.Application$$FastClassByGuice$$b5b6aa19.newInstance()
一种解决方法是手动终止播放应用程序,然后重新运行它。但这似乎并不好。有更好的主意吗?

我也有同样的问题。 有一个对我有效的解决方案:

定义LocalSparkProvider.scala对象:

object LocalSparkProvider {
  val sparkContext = new SparkContext(new SparkConf().setAppName("myApplication").setMaster("local"))
  val sqlContext = new SQLContext = new SQLContext(sparkContext)
}
现在在根包下创建Global.scala对象(在播放应用程序中是“app”目录)

当应用程序被重新加载时,Play会触发onStop方法。可用于停止spark上下文

import play.api.GlobalSettings

object Global extends GlobalSettings {
  override def onStop(app: play.api.Application): Unit = { // Use an explicit definition of the package!
    LocalSparkProvider.sparkContext.stop()
  }
}