2

Scala と SBT を使用した単純な Spark アプリケーションがあります。まず、私は次のことをしようとしました:

  • 走るsbt clean package

  • 走るspark-submit --class Main ./target/scala-2.11/sparktest_2.11-1.0.jar

ただし、次の例外で失敗します。

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/scala/DefaultScalaModule$

次に、SBT のアセンブリ プラグインを試しましたが、代わりに次の例外が発生しました。

java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.addField(Lcom/fasterxml/jackson/databind/introspect/AnnotatedField;Lcom/fasterxml/jackson/databind/PropertyName;ZZZ)V

ご覧のとおり、すべてが Jackson ライブラリと Scala サポートに関連しているように見えます。ライブラリのバージョンに関連する問題でしょうか?

私の build.sbt は次のようになります。

name := "SparkTest"

version := "1.0"

scalaVersion := "2.11.4"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-feature")

libraryDependencies ++= {
  Seq(
    "org.apache.spark"              %% "spark-core"           % "1.2.1"     % "provided",
    "com.fasterxml.jackson.core"    % "jackson-core"          % "2.4.1",
    "com.fasterxml.jackson.core"    % "jackson-databind"      % "2.4.1",
    "com.fasterxml.jackson.module"  %% "jackson-module-scala" % "2.4.1"
  )
}

そして、私のアプリケーション コードは次のとおりです。

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import org.apache.spark.{SparkConf, SparkContext}

trait JsonUtil {
  val mapper = new ObjectMapper()
  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
}

case class Person(name: String)

object Main extends JsonUtil {

  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("Spark Test App")
    val sc = new SparkContext(conf)
    val inputFile = "/home/user/data/person.json"
    val input = sc.textFile(inputFile)

    val persons = input.flatMap { line ⇒ {
      try {
        println(s"  [DEBUG] trying to parse '$line'")
        Some(mapper.readValue(line, classOf[Person]))
      } catch {
        case e : Exception ⇒
          println(s"  [EXCEPTION] ${e.getMessage}")
          None
      }
    }}

    println("PERSON LIST:")
    for (p ← persons) {
      println(s"  $p")
    }
    println("END")
  }

}

編集:問題は Spark アプリケーションに関連しているようです。JSON アンマーシャリングをテストするためだけに単純なアプリケーションを実行すると、すべて問題なく動作します。しかし、Spark アプリケーションから同じことをしようとすると、上記のような問題が発生します。何か案は?

4

0 に答える 0