火花流:java.lang.NoClassDefFoundError:kafka/api/TopicMetadataRequest
Posted
技术标签:
【中文标题】火花流:java.lang.NoClassDefFoundError:kafka/api/TopicMetadataRequest【英文标题】:Spark Streaming: java.lang.NoClassDefFoundError: kafka/api/TopicMetadataRequest 【发布时间】:2017-07-20 10:43:15 【问题描述】:我编写了一个从 kafka 读取数据的 spark 流应用程序。
我已经用spark1.6.0
和kafka0.8.2.2
构建了这个jar。
我正在使用kafka直接流api:
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
当我在 yarn-client 模式下运行应用程序时,它运行成功,但是当我在 yarn-cluster 模式下运行时,它失败并出现以下异常:
User class threw exception: java.lang.NoClassDefFoundError: kafka/api/TopicMetadataRequest.
我已经在应用程序 jar 中打包了 kafka 类,即使在运行时,kafka/api/TopicMetadataRequest 也会从应用程序 jar 中加载。
据我了解,NoClassDefFoundError
会在编译和运行时版本不匹配时发生。
------------编辑------------
我的 .sbt 有以下块:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.6.0" % "provided",
"org.apache.spark" %% "spark-sql" % "1.6.0" % "provided",
"org.apache.spark" %% "spark-streaming" % "1.6.0" % "provided",
"org.apache.spark" %% "spark-mllib" % "1.6.0" % "provided",
"org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.0",
"org.apache.kafka" % "kafka_2.10" % "0.8.2.2",
"org.springframework.security" % "spring-security-web" % "3.0.7.RELEASE",
"org.scalatest" % "scalatest_2.10" % "3.0.0-M12" % "test",
"junit" % "junit" % "4.11",
"com.typesafe.play" % "play_2.10" % "2.4.0-M2",
"org.apache.httpcomponents" % "httpclient" % "4.2.5" )
mergeStrategy in assembly <<= (mergeStrategy in assembly) (old) =>
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
任何建议如何解决这个问题或为什么会发生这个异常?
【问题讨论】:
看起来您缺少将 jar 发送到集群的SPARK.JARS
设置。
根据文档,我们不需要为应用程序 jar 提供任何选项。对 ? $ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]
你是怎么做到的"我已经用 spark1.6.0 和 kafka0.8.2.2 构建了 jar" 你是如何定义对 spark-streaming-kafka
Spark 模块的依赖的?
我在 sbt 文件中添加了依赖项:"org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.0", "org.apache.kafka" % "kafka_2.10" % "0.8.2.2",
你正在构建一个“程序集”,对吧?
【参考方案1】:
KafkaUtils
在 Spark 中不可用,您必须将 spark-streaming-kafka
模块单独添加到您的 Spark 应用程序中。
您应该使用--packages
命令行选项。
./bin/spark-shell --packages org.apache.spark:spark-streaming-kafka-0-10_2.10:1.6.0
为 Scala 和 Spark 使用正确的版本。
【讨论】:
我认为问题会是别的,因为这是在 yarn-client 模式下工作的。另外我已经添加了spark-streaming-kafka
:"org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.0", "org.apache.kafka" % "kafka_2.10" % "0.8.2.2",
以上是关于火花流:java.lang.NoClassDefFoundError:kafka/api/TopicMetadataRequest的主要内容,如果未能解决你的问题,请参考以下文章