ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spark] spark-streaming-kafka-0-10 종속성 오류 해결
    OpenSource 2017. 11. 10. 11:11

    이와 같은 sbt 빌드 파일을 통해 컴파일을 함.

     

    name := "spark-streaming-with-kafka"

    version := "1.0"

    scalaVersion := "2.11.8"

    fork := true

    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.0"

    libraryDependencies += "org.apache.spark" %% "spark-streaming" % "2.2.0"

    libraryDependencies += "org.apache.spark" % "spark-streaming-kafka-0-10_2.11" % "2.2.0"

    libraryDependencies += "org.apache.spark" %% "spark-sql-kafka-0-10" % "2.2.0"

    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0"

    libraryDependencies += "info.batey.kafka" % "kafka-unit" % "0.6"

    libraryDependencies += "net.sf.jopt-simple" % "jopt-simple" % "5.0.2"

    libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.5.0"

    scalacOptions += "-target:jvm-1.8"

     

     

    정상적으로 컴파일 후 spark 작업을 submit하려고 할 때, 다음과 같은 오류가 발생함.

     

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/kafka/common/serialization/StringDeserializer
     at WordCount$.main(WordCount.scala:91)
     at WordCount.main(WordCount.scala)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:498)
     at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
     at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
     at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
    Caused by: java.lang.ClassNotFoundException: org.apache.kafka.common.serialization.StringDeserializer
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     ... 11 more

     

     

    문제는 제대로 빌드되지 않은 uber jar 때문임.

     

    spark-streaming-kafka-0-10 모듈이 spark의 CLASSPATH에 기본적으로 포함되어 있지 않기 때문에

    spark application을 빌드할 때 함께 uber jar에 포함시켜도 제대로 작동하지 않는다.

     

    따라서 spark-submit 명령을 실행할 때, 모듈 로드를 해주는 '--packages' 옵션이 필요하다.

    이 옵션은 로컬 maven repo와 maven 중앙 저장소와 --repositiores 옵션을 지정할 수 있는 추가 원격 repository를 검색하여

    드라이버 및 executor의 classpath에 해당하는 jar를 포함시킨다.

     

    $ ./bin/spark-submit --help
    ...
      --packages                  Comma-separated list of maven coordinates of jars to include
                                  on the driver and executor classpaths. Will search the local
                                  maven repo, then maven central and any additional remote
                                  repositories given by --repositories. The format for the
                                  coordinates should be groupId:artifactId:version.
    ...

     

    따라서 spark 작업을 제출할 때, 다음과 같은 명령을 실행하여 문제를 해결할 수 있다.

     

     

    ../spark-2.2.0-bin-hadoop2.7/bin/spark-submit --class WordCount --packages org.apache.spark:spark-streaming-kafka-0-10_2.11:2.2.0 target/scala-2.11/spark-streaming-with-kafka_2.11-1.0.jar
Designed by Tistory.