-
[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'OpenSource' 카테고리의 다른 글
[Flink] Keyed State (0) 2017.08.29 [Flink] Apache Flink 시작하기 (0) 2017.07.18 [GRPC] gRPC 소개 및 Go 기반 gRPC 설치 (0) 2017.05.31 [oVirt] 소개 (1) 2017.05.31 [Protocol Buffer] 프로토콜 버퍼 소개 및 Go에서의 사용법 (0) 2017.05.18