我的intellij项目中有一些Spark单元测试。当我逐个启动它们(逐个文件)时一切正常。当我想测试所有包时,我得到了:
导致中止运行的异常或错误:此JVM中只能运行一个SparkContext(请参阅SPARK-2243)。要忽略此错误,请设置spark.driver.allowMultipleContexts = true。
我已经读过将spark.driver.allowMultipleContexts设置为true是危险的: - /
有没有办法告诉intellij逐个运行测试。
答案 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()