火花单元测试(在intellij中)

时间:2016-02-18 11:47:45

标签: intellij-idea apache-spark

我的intellij项目中有一些Spark单元测试。当我逐个启动它们(逐个文件)时一切正常。当我想测试所有包时,我得到了:

  

导致中止运行的异常或错误:此JVM中只能运行一个SparkContext(请参阅SPARK-2243)。要忽略此错误,请设置spark.driver.allowMultipleContexts = true。

我已经读过将spark.driver.allowMultipleContexts设置为true是危险的: - /

有没有办法告诉intellij逐个运行测试。

2 个答案:

答案 0 :(得分:5)

Spark本身带有使用a shared Spark上下文特征的单元测试,因此您不必使用多个特征。您可以复制它并在自己的测试中使用它。

然而,我仍然遇到一些问题,其中IntelliJ中的测试是并行访问上下文的。可以让所有测试都以串行方式运行,但是我使用以下版本的trait来锁定,以便 Spark测试在系列中运行,其他测试仍然可以并行运行:< / p>

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

import scala.concurrent.Lock

object Spark {
  val lock = new Lock()
}

trait Spark extends BeforeAndAfterAll { self: Suite =>
  @transient private var _sc: SparkContext = _

  def sc: SparkContext = _sc

  var conf = new SparkConf(false)

  override def beforeAll() {
    Spark.lock.acquire()
    _sc = new SparkContext("local[4]", "test", conf)
    super.beforeAll()
  }

  override def afterAll() {
    if (_sc != null) {
      _sc.stop()
    }
    Spark.lock.release()

    // To avoid Akka rebinding to the same port, since it doesn't unbind immediately on shutdown
    System.clearProperty("spark.driver.port")

    _sc = null
    super.afterAll()
  }
}

您可以在测试中使用此特征,如下所示:

class MySpec extends FlatSpec with Spark {
  "I" should "be able to use Spark" in {
    sc.parallelize(Seq(1, 2, 3, 4, 5))
  }
}

答案 1 :(得分:1)

在每个测试中,在测试结束时,关闭spark上下文并在下一个测试开始时再次创建它:

sparkContext.stop()

val sparkContext = new SparkContext()