Intellij idea 火花单元测试(在intellij中)

Intellij idea 火花单元测试(在intellij中),intellij-idea,apache-spark,Intellij Idea,Apache Spark,我的intellij项目中有一些Spark单元测试。当我一个接一个(一个文件接一个文件)地启动它们时,一切都正常。当我想测试所有软件包时,我有: 异常或错误导致运行中止:此JVM中只能运行一个SparkContext(请参阅SPARK-2243)。要忽略此错误,请将spark.driver.allowMultipleContexts设置为true 我已经读到,将spark.driver.allowMultipleContexts设置为true是危险的:-/ 有没有办法告诉intellij逐个运行

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

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

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


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

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

sparkContext.stop()

以及:


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

sparkContext.stop()

以及:


Spark本身带有单元测试,它使用一个特性和上下文,所以您不必使用多个特性。您可以复制它并在自己的测试中使用它

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

import org.apache.spark.{SparkContext,SparkConf}
导入org.scalatest_
导入scala.concurrent.Lock
物体火花{
val lock=新锁()
}
特质火花在前后扩展{self:Suite=>
@临时专用变量_sc:SparkContext=_
def sc:SparkContext=\u sc
var conf=new SparkConf(false)
覆盖def beforeAll(){
Spark.lock.acquire()
_sc=新的SparkContext(“本地[4],“测试”,配置)
super.beforeAll()
}
覆盖def afterAll(){
如果(_sc!=null){
_sc.停止()
}
Spark.lock.release()
//避免Akka重新绑定到同一端口,因为它不会在关机时立即解除绑定
System.clearProperty(“spark.driver.port”)
_sc=null
超级
}
}
您可以在测试中使用此特性,如下所示:

classmyspec使用Spark扩展FlatSpec{
“我”应该“能够使用火花”在{
sc.并行化(序号(1、2、3、4、5))
}
}

Spark本身附带了单元测试,它将一个特性与上下文一起使用,因此您不必使用多个特性。您可以复制它并在自己的测试中使用它

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

import org.apache.spark.{SparkContext,SparkConf}
导入org.scalatest_
导入scala.concurrent.Lock
物体火花{
val lock=新锁()
}
特质火花在前后扩展{self:Suite=>
@临时专用变量_sc:SparkContext=_
def sc:SparkContext=\u sc
var conf=new SparkConf(false)
覆盖def beforeAll(){
Spark.lock.acquire()
_sc=新的SparkContext(“本地[4],“测试”,配置)
super.beforeAll()
}
覆盖def afterAll(){
如果(_sc!=null){
_sc.停止()
}
Spark.lock.release()
//避免Akka重新绑定到同一端口,因为它不会在关机时立即解除绑定
System.clearProperty(“spark.driver.port”)
_sc=null
超级
}
}
您可以在测试中使用此特性,如下所示:

classmyspec使用Spark扩展FlatSpec{
“我”应该“能够使用火花”在{
sc.并行化(序号(1、2、3、4、5))
}
}

看起来是一个完美的解决方案,但为什么我要导入org.scalatest。{before and afterall,Suite}引发对象scalatest的不是包org的成员。我在build.sbt中有这样一句话:“org.scalatest”%“scalatest_2.10”%“2.2.1”%“test”,我不确定,但我看到你把它放到了一个单独的问题中。让我们知道它是否可以工作,它可以工作,但是我必须把这个文件放在src/test/scala目录下,而不是src/main/scala目录下。因此,我必须在我的所有项目中应用它:-/谢谢,这是一个完美的解决方案,但为什么我要导入org.scalatest.{before and afterall,Suite}来生成对象scalatest,它不是包org的成员。我在build.sbt中有这样一句话:“org.scalatest”%“scalatest_2.10”%“2.2.1”%“test”,我不确定,但我看到你把它放到了一个单独的问题中。让我们知道它是否可以工作,它可以工作,但是我必须把这个文件放在src/test/scala目录下,而不是src/main/scala目录下。所以我必须在我所有的项目中应用它:-/谢谢
val sparkContext = new SparkContext()