Spark依赖于json4s 3.2.10,但这个版本有几个bug,我需要使用3.2.11。我在build.sbt中添加了json4s本机3.2.11依赖项,一切都编译得很好。但是当我触发提交我的JAR时,它为我提供了3.2.10。
build.sbt
import sbt.Keys._
name := "sparkapp"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.0" % "provided"
libraryDependencies += "org.json4s" %% "json4s-native" % "3.2.11"`
插件.sbt
logLevel := Level.Warn
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
App1.scala
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.{Logging, SparkConf, SparkContext}
import org.apache.spark.SparkContext._
object App1 extends Logging {
def main(args: Array[String]) = {
val conf = new SparkConf().setAppName("App1")
val sc = new SparkContext(conf)
println(s"json4s version: ${org.json4s.BuildInfo.version.toString}")
}
}
sbt 0.13.7+sbt组件0.13.0Scala 2.10.4
有没有办法强制使用3.2.11版本?
我们遇到了一个类似于Necro描述的问题,但在构建组装jar时从3.2.11降级到3.2.10并没有解决它。我们最终通过在作业组装jar中对3.2.11版本进行着色来解决它(使用Spark 1.3.1):
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.json4s.**" -> "shaded.json4s.@1").inAll
)
我在Spark用户邮件列表中问了同样的问题,得到了两个答案:
-
使用spark.driver.userClassPathFirst=true和spark.executor.userClassPathFirst=true选项,但它仅适用于spark 1.3,可能需要进行一些其他修改,如从构建中排除Scala类。
-
使用json4s 3.2.11版本重建Spark(您可以在core/pom.xml中更改它)
两者都很好,我更喜欢第二个。
这不是你的问题的答案,但这是在搜索我的问题时出现的。我在json4s的"render"中得到了格式为.emptyValueStrategy.replaceEmpty(value)的NoSuchMethod异常。原因是我使用3.2.11构建,但Spark连接了3.2.10。我降级到3.2.10,我的问题就消失了。你的问题帮助我理解了发生了什么(Spark链接了一个冲突版本的json4s),我能够解决这个问题,所以谢谢。