Можно ли использовать json4s 3.2.11 с Spark 1.3.0?

Spark зависит от json4s 3.2.10, но в этой версии есть несколько ошибок, и мне нужно использовать 3.2.11. Я добавил json4s-native 3.2.11 зависимость к build.sbt и все скомпилировалось нормально. Но когда я отправляю мой 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"`

plugins.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.0 Scala 2.10.4

Есть ли способ заставить использование версии 3.2.11?

3 ответа

Мы столкнулись с проблемой, похожей на ту, которую описывает Necro, но понижение с 3.2.11 до 3.2.10 при сборке jar сборки не решило ее. В итоге мы решили ее (используя Spark 1.3.1), затеняя версию 3.2.11 в jar сборки задания:

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

Я задал тот же вопрос в списке рассылки Spark User и получил два ответа, как заставить его работать:

  1. Используйте параметры spark.driver.userClassPathFirst=true и spark.executor.userClassPathFirst=true, но он работает только в Spark 1.3 и, вероятно, потребует некоторых других изменений, таких как исключение классов Scala из вашей сборки.

  2. Перестройте Spark с версией json4s 3.2.11 (вы можете изменить ее в core/pom.xml)

Оба работают нормально, я предпочел второй.

Это не ответ на ваш вопрос, но он возник при поиске моей проблемы. Я получаю исключение NoSuchMethod в format.emptyValueStrategy.replaceEmpty(value) в json4s'render'. Причиной было то, что я строил с 3.2.11, но Spark связывал 3.2.10. Я понизил до 3.2.10, и моя проблема ушла. Ваш вопрос помог мне понять, что происходит (что Spark связывал конфликтующую версию json4s), и я смог решить проблему, так что спасибо.

Другие вопросы по тегам