火花单元测试(在intellij中)

Ben*_*min 1 intellij-idea apache-spark

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

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

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

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

sgv*_*gvd 5

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

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

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()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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