当前位置: 首页 > 知识库问答 >
问题:

使用sbt测试运行时Spark测试失败

鲜于温书
2023-03-14

我们已经为spark编写了单元测试,在本地模式下有4个线程。

当一个接一个地启动时,例如通过intellij或sbt testOnly,每个测试都运行良好。

当用sbt测试启动时,它们会出现如下错误

libraryDependencies ++= Seq(
  Dependencies.Test.concordion,
  Dependencies.`spark-sql` exclude("org.slf4j","slf4j-log4j12"),
  Dependencies.`better-files`
)

fork in test := true


dependencyOverrides += "com.google.guava" % "guava" % "11.0.2" 
dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.7.1"

我们使用的是一个带有多个子项目的sbt项目,其定义如下:

scalacOptions in ThisBuild ++= Seq(
  "-encoding", "UTF-8", // source files are in UTF-8
  "-deprecation", // warn about use of deprecated APIs
  "-Yrangepos", // use range positions for syntax trees
  "-language:postfixOps", //  enables postfix operators
  "-language:implicitConversions", // enables defining implicit methods and members
  "-language:existentials", // enables writing existential types
  "-language:reflectiveCalls", // enables reflection
  "-language:higherKinds", // allow higher kinded types without `import scala.language.higherKinds`
  "-unchecked", // warn about unchecked type parameters
  "-feature", // warn about misused language features
  /*"-Xlint",               // enable handy linter warnings
    "-Xfatal-warnings",     // turn compiler warnings into errors*/
  "-Ypartial-unification" // allow the compiler to unify type constructors of different arities
)

autoCompilerPlugins := true

addCompilerPlugin(Dependencies.`kind-projector`)
addCompilerPlugin(Dependencies.`better-monadic-for`)


// Define the root project, and make it compile all child projects
lazy val `datarepo` =
  project
    .in(file("."))
    .aggregate(
      `foo`,
      `foo-other`,
      `sparkusingproject`,
      `sparkusingproject-test`,
      `sparkusingproject-other`,
    )

// Define individual projects, the directories they reside in, and other projects they depend on
lazy val `foo` =
  project
    .in(file("foo"))
    .settings(Common.defaultSettings: _*)

lazy val `foo-other` =
  project
    .in(file("foo-other"))
    .dependsOn(`foo`)
    .settings(Common.defaultSettings: _*)

共有1个答案

斜宁
2023-03-14

我只是在一个测试中遇到了这个异常,它是由于试图在一个线程中运行Spark操作而导致的,这个线程与我启动sparksession的线程不同。您可能希望在test中禁用ParallelExecution(无论如何,对于Spark集成测试,这是建议的)。

具体地说,我试图并行执行多个Spark操作,并且在Scala的executioncontext.global线程池中尝试执行这些操作。当我创建NewFixedPoolExecutor时,一切都开始正常工作。

AFAICT这是因为在datasource.scala:610中,Spark获得线程的ContextClassLoader:

    val loader = Utils.getContextOrSparkClassLoader

 类似资料:
  • 就像 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。可以指定命令行参数来改变 cargo test 的默认行为。例如,cargo test 生成的二进制文件的默认行为是并行的运行所有测试,并捕获测试运行过程中产生的输出避免他们被显示出来,使得阅读测试结果相关的内容变得更容易。 这些选项的一部分可以传递给 cargo test,而另一些则

  • 正如前面提到的,connectedCheck 需要一个已连接设备。这个过程依赖于 connectedDebugAndroidTest task,因此 connectedDebugAndroidTest task 也会运行。该 task 会执行以下内容: 确认应用和测试应用已被构建(依赖于 assembleDebug 和 assembleDebugAndroidTest) 安装这两个应用 运行测试

  • 5.2 运行测试 正如前面所提到的,引导任务 connectedCheck 需要一个已经连接的设备才能运行。 这会依赖 androidTest ,所以 androidTest 也会被运行。这个任务做了以下事情: 确保应用和测试应用已经被构建(依赖 assembleDebug 和 assembleTest ) 安装这两个应用 运行测试 卸着这两个应用 如果同时有多个连接的设备,那么所有的测试会在所有

  • 问题内容: 有没有办法在单元测试失败时自动启动调试器? 现在,我只是手动使用pdb.set_trace(),但这非常繁琐,因为我需要每次都添加它并在最后将其取出。 例如: 问题答案: 我更正了在异常而不是set_trace上调用post_mortem的代码。

  • 问题内容: 我有一个包含多个模块的项目。当所有测试通过时,Maven测试将全部运行。 当第一个模块中的测试失败时,maven将不会继续进行下一个项目。我在Surefire设置中将testFailureIgnore设置为true,但这无济于事。 我如何使Maven运行所有测试? 问题答案: 我刚刚找到了“ -fae”参数,该参数使Maven运行所有测试并且不会因失败而停止。

  • 我正在Scala中开发一个利用SBT构建的Spark应用程序。Spark创建了非常冗长的日志记录,在运行测试时,我希望忽略这些日志记录。 我在src/test/resources和src/main/resources下设置了log4j.properties文件,其内容如下: