如何在打开新的SparkContext之前停止正在运行的SparkContext?

21

我正在使用Scala和Spark进行测试,创建SparkContext的方式如下:

val conf = new SparkConf().setMaster("local").setAppName("test")
val sc = new SparkContext(conf)

第一次执行时没有错误。但现在出现了这个消息(以及测试失败的通知):

Only one SparkContext may be running in this JVM (see SPARK-2243).

看起来我需要检查是否有正在运行的SparkContext并在启动新的之前停止它(我不想允许多个上下文)。我该怎么做?

更新:

我尝试了这个,但是出现了相同的错误(我正在从IntellijIdea运行测试,并在执行代码之前对其进行编译):

val conf = new SparkConf().setMaster("local").setAppName("test")
                          // also tried: .set("spark.driver.allowMultipleContexts", "true")

更新2:

class TestApp extends SparkFunSuite with TestSuiteBase {

  // use longer wait time to ensure job completion
  override def maxWaitTimeMillis: Int = 20000

  System.clearProperty("spark.driver.port")
  System.clearProperty("spark.hostPort")

  var ssc: StreamingContext = _
  val config: SparkConf = new SparkConf().setMaster("local").setAppName("test")
                                         .set("spark.driver.allowMultipleContexts", "true")
  val sc: SparkContext = new SparkContext(config)

//...

test("Test1")
{

sc.stop()
}

}

1
这是一个常见的错误。根据您的测试框架,您应该在测试中使用before/after块来共享相同的Spark上下文,并且仅在所有测试完成时停止您的上下文。 - jarandaf
@jarandaf:您能否提供一些在此上下文中使用“before / after”的示例? - Klue
你可能想看看这个链接(https://spark-summit.org/2014/wp-content/uploads/2014/06/Testing-Spark-Best-Practices-Anupama-Shetty-Neil-Marshall.pdf),虽然有点“老”,但可以帮助你入门。 - jarandaf
尝试将sc.stop()语句保留在定义sparkcontext的主函数中,检查是否解决了错误。 - JKC
1个回答

25

要停止现有的上下文,您可以使用给定SparkContext实例上的stop方法。

import org.apache.spark.{SparkContext, SparkConf}

val conf: SparkConf = ???
val sc: SparkContext = new SparkContext(conf)
...
sc.stop()

要重用现有的上下文或创建一个新的上下文,您可以使用SparkContext.getOrCreate方法。

val sc1 = SparkContext.getOrCreate(conf)
...
val sc2 = SparkContext.getOrCreate(conf)

在测试套件中使用这两种方法可以实现不同的功能:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接