Scala Play、Apache Spark 和 KuduContext 不兼容

Scala Play, Apache Spark and KuduContext incompatibilities

我不知道发生这种情况是因为 Scala 的版本限制如此之大,还是因为所有库都已弃用且未更新。

我在 Scala Play 和 Apache Spark 中有一个小项目。我想要并且喜欢使用最新版本的库,所以我开始了这个项目:

Scala v2.12.2
Play Framework v2.8.2
Apache Spark v3.0.0

我需要读取 csv,对其进行处理并插入 Impala Kudu 数据库。使用 jdbc 连接并使用带有查询的准备好的语句插入数据并不是一种改进,因为我没有以最大功率使用 Apache Spark(仅用于读取文件)。

所以,我听说了 KuduContext。我试图安装它,但令人惊讶。 KuduContext 仅适用于 Scala v2.11Apache Spark v2.4.6(与 Play 无关)。

我卸载了spark v3,重新为Spark v2.4.6下载安装环境。 使用这些配置创建了新项目

Scala v2.11.11
Play Framework v2.8.2
Apache Spark v2.4.6
KuduSpark2 v1.12.0

我发现一些与 Play 不兼容的东西并将其降级到 2.7。后来发现和Jackson模块有些不兼容。

java.lang.ExceptionInInitializerError
...
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.9.10-1

需要安装 "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.6.5"。现在,当我启动项目时,当使用 SparkContext 时,我会产生另一个错误

java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.rdd.RDDOperationScope$

...

最后,我的build.sbt变成了:

Scala v2.11.11
Play Framework v2.8.2
Apache Spark v2.4.6
KuduSpark2 v1.12.0
jackson-module-scala v2.6.5

一些代码:

object SparkContext {
  val spark = SparkSession
    .builder
    .appName("SparkApp")
    .master("local[*]")
    .config("spark.sql.warehouse.dir", "file:///C:/temp") // Necessary to work around a Windows bug in Spark 2.0.0; omit if you're not on Windows.
    .getOrCreate()

  val context = spark.sparkContext
}

SparkContext 在此处使用:

val df = SparkContext.spark.read.csv(filePath) // here the error ocurred
val lines = df.take(1001).map(mapper)

在这个生态系统中创建新的库版本时,需要考虑与其他库的兼容性这么重吗?我发现很多关于版本不兼容的帖子,但没有找到解决方案。我在这里想念什么?谢谢

靠,我找到解决办法了:

libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.11.1"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.11.1"

除了jackson-module,我还需要安装jackson-databind。

我的build.sbt变成了:

scalaVersion := "2.11.11"
val sparkVersion = "2.4.6"
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.kudu" %% "kudu-spark2" % "1.12.0"
)
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.11.1"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.11.1"

// plugins.sbt
play version "2.7.5"

我真的希望这会帮助其他需要一起使用这些库的人以及发现像我这样的问题的人。我花了 3 个小时找到一个“简单”项目配置的解决方案。