我正在开发的应用程序必须在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
。
答案 0 :(得分:0)
嗯,答案很简单,实际上:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.json4s.**" -> "shaded_json4s.@1").inAll
),
我宁愿使用inLibrary / inProject,所以我很快就会这样做。
在找到答案的过程中,我偶然发现了一个重复的问题。