gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:41:21 26 4
gpt4 key购买 nike

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

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

当使用 sbt test 启动时,它们会失败并出现类似的错误
[info] java.util.ServiceConfigurationError: org.apache.spark.sql.sources.DataSourceRegister: Provider org.apache.spark.sql.execution.datasources.csv.CSVFileFormat not a subtype
我们特别将 sbt 和 spark 版本升级到最新版本,尝试使用 fork in test := true 运行在 build.sbt 中,但这没有帮助。

Spark 的版本为 2.4.3,sbt 为 1.2.8,scala 为 2.12.8。

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: _*)

最佳答案

我刚刚在测试中遇到了这个异常,它是由于试图在与我启动 SparkSession 的线程不同的线程中运行 Spark 操作引起的。 .您可能想要禁用 parallelExecution in Test (无论如何,建议将其用于 Spark 集成测试)。

具体来说,我试图并行执行多个 Spark 操作,我尝试在 Scala 的 ExecutionContext.global 中这样做。线程池。当我创建一个 newFixedPoolExecutor相反,一切开始正常。

AFAICT 这是因为在 DataSource.scala:610 ,Spark获取线程的ContextClassLoader:

    val loader = Utils.getContextOrSparkClassLoader

并且,当在 Scala 的默认线程池中运行时,类加载器不包含相关的类和接口(interface)。相反,当您创建一个新的线程池时,它会从当前线程继承正确的类加载器,然后可以正常工作。

关于scala - 使用 sbt 测试运行时 Spark 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com