我正在使用Scala在Scala中执行测试,创建了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并在启动新的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()
}

}

最佳答案

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

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

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


要重用现有上下文或创建新上下文,可以使用SparkContex.getOrCreate方法。

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


在测试套件中使用时,两种方法都可以用来实现不同的目标:


stop-在afterAll方法中停止上下文(例如,参见MLlibTestSparkContext.afterAll
getOrCreate-在单个测试用例中获取活动实例(例如,参见QuantileDiscretizerSuite

10-06 13:39