如何在Spark 2.1执行程序中加载更新版本的json4s?

时间:2018-04-04 20:12:26

标签: scala apache-spark

我正在开发的应用程序必须在Azure上的Spark 2.1下运行。我用更新版本的json4s(从3.2.11到3.3.0)为应用更新了build.sbt 修复Double序列化的错误:

libraryDependencies += "org.json4s" %% "json4s-native" % "3.3.0",
libraryDependencies += "org.json4s" %% "json4s-ext" % "3.3.0",

但是,在Spark 2.1下使用json4s的FieldSerializer:

implicit val formats = DefaultFormats +
    new FieldSerializer[MyClass](renameTo("name", "anotherName"))

我收到此错误:

java.lang.NoSuchMethodError: org.json4s.FieldSerializer$.$lessinit$greater$default$3()Z

注意FieldSerializer声明中的这一变化来自3.2.11

case class FieldSerializer[A](
  serializer:   PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
  deserializer: PartialFunction[JField, JField] = Map()
)(implicit val mf: Manifest[A])

到3.3.0:

case class FieldSerializer[A](
  serializer:   PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
  deserializer: PartialFunction[JField, JField] = Map(),
  includeLazyVal: Boolean = false
)(implicit val mf: Manifest[A])

我对错误消息的解释是没有声明第三个参数,这表明json4s 3.2.11仍然被使用。 鉴于此,我将json4s库声明为“提供”,并在启动脚本中命名它们:

spark-submit
...
--packages org.json4s:json4s-native_2.11:3.3.0,org.json4s:json4s-ext_2.11:3.3.0
...

这会导致jar被下载到〜/ .ivy2 / jars,但会发生同样的错误。有没有办法转储Spark用于执行程序的库?我使用--conf spark.executor.extraJavaOptions="-verbose",但从未表现出来 正在加载FieldSerializer,即使它显示了很长的类加载列表。

有没有办法强制Spark在执行程序中使用3.3.0版,或者不加载3.2.11?

编辑:

我没有打印库版本的通用解决方案,但对于json4s,我可以在运行时打印BuildInfo.version,这表明 版本3.2.11正在使用或不使用--packages

1 个答案:

答案 0 :(得分:0)

嗯,答案很简单,实际上:

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("org.json4s.**" -> "shaded_json4s.@1").inAll
),

我宁愿使用inLibrary / inProject,所以我很快就会这样做。

在找到答案的过程中,我偶然发现了一个重复的问题。