无法在 Spark-2.2.0 - Scala-2.11.8 上运行单元测试(scalatest)

Posted

技术标签:

【中文标题】无法在 Spark-2.2.0 - Scala-2.11.8 上运行单元测试(scalatest)【英文标题】:Unable to run Unit tests (scalatest) on Spark-2.2.0 - Scala-2.11.8 【发布时间】:2018-01-30 16:16:36 【问题描述】:

无法在 spark-2.2.0 上使用上下文运行 run scalatest

堆栈跟踪:

异常或错误导致运行中止:org.apache.spark.sql.test.SharedSQLContext.eventually(Lorg/scalatest/concurrent/PatienceConfiguration$Timeout;Lscala/Function0;Lorg/scalatest/concurrent/AbstractPatienceConfiguration$PatienceConfig ;)Ljava/lang/Object; java.lang.NoSuchMethodError: org.apache.spark.sql.test.SharedSQLContext.eventually(Lorg/scalatest/concurrent/PatienceConfiguration$Timeout;Lscala/Function0;Lorg/scalatest/concurrent/AbstractPatienceConfiguration$PatienceConfig;)Ljava/lang/Object ; 在 org.apache.spark.sql.test.SharedSQLContext$class.afterEach(SharedSQLContext.scala:92) 在 testUtils.ScalaTestWithContext1.afterEach(ScalaTestWithContext1.scala:7) 在 org.scalatest.BeforeAndAfterEach$$anonfun$1.apply$mcV$sp(BeforeAndAfterEach.scala:234)

示例代码:

  import org.apache.spark.sql.SparkSession
  import testUtils.ScalaTestWithContext1

  class SampLeTest extends ScalaTestWithContext1 
  override protected def spark: SparkSession = ???

     test("test") 
        1 == 1 shouldBe true
     
  

ScalaTestWithContext1.scala

  import org.apache.spark.sql.QueryTest
  import org.apache.spark.sql.test.SharedSQLContext
  import org.scalatest.BeforeAndAfterAll, Matchers

  abstract class ScalaTestWithContext extends QueryTest with SharedSQLContext with Matchers with BeforeAndAfterAll

build.sbt:

name := "test"
version := "1.0"
scalaVersion := "2.11.11"

parallelExecution in Test := false

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-library" % "2.11.11" % "provided",
  "org.apache.spark" %% "spark-core" % "2.2.0",
  "org.apache.spark" %% "spark-sql" % "2.2.0",
  "org.apache.spark" %% "spark-catalyst" % "2.2.0",
  "org.apache.spark" %% "spark-core" % "2.2.0" % "test" classifier 
"tests",
  "org.apache.spark" %% "spark-sql" % "2.2.0" % "test" classifier 
"tests",
  "org.apache.spark" %% "spark-catalyst" % "2.2.0" % "test" classifier 
"tests",
  "org.scalatest" %% "scalatest" % "3.0.1" % "test"
) 

ScalaTestWithContext1 类扩展了 SharedSQLContext 和所有必需的特征。

提前致谢。

【问题讨论】:

稍微减少堆栈跟踪并添加一些相关代码。 scalatest with sharedSQLContext 适用于 spark-2.1.0,我对 spark-2.2.0 有问题 项目的build.sbt 是什么? 【参考方案1】:

我遇到了类似的问题。对我有用的解决方案是使用 Scalatest 的 2.2.6 版本而不是 3.x 版本。 Maven repository 还在“测试依赖项”部分中显示了正确的依赖项。

【讨论】:

试过了。我的依赖项中存在的两个 jar 都从测试依赖项中删除了 2.x。仍然有同样的问题。 保留2.2.6的依赖,删除3.x的依赖。 试过了。不工作。我们找到了根本不使用 SharedSQLContext 的解决方法。感谢您的建议。 您可以分享您的解决方法。我们正在尝试对 spark jdbc 和 hive 上下文相关代码进行单元测试。【参考方案2】:

类似as already pointed out,请查看Spark's github repository 中的pom.xml 文件,以确保您使用的是相同的最新版本。

可能有更好的解决方案,例如将 sbt 合并或覆盖您首选的 scalatest 版本而不是 Spark,但截至 2019 年 12 月,Spark 2.4.4 正在使用 Scalatest 3.0.3,这是相当新的。

【讨论】:

以上是关于无法在 Spark-2.2.0 - Scala-2.11.8 上运行单元测试(scalatest)的主要内容,如果未能解决你的问题,请参考以下文章

无法过滤存储在 spark 2.2.0 数据框中的 CSV 列

hive-------ls: 无法访问/opt/apps/spark-2.2.0/lib/spark-assembly-*.jar: 没有那个文件或目录

使用 Spark 2.2.0 从 Hive Metastore 2.x 读取 [重复]

从 Spark 连接到 Redshift 时无法推断架构

无法为 pyspark OSX 启动 Jupyter Notebook:IPYTHON 和 IPYTHON_OPTS 在 Spark 2.0+ 中被删除

我们如何在 SPARK 2.2.0 中将外部表转换为托管表?