火花流: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.0kafka0.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] &lt;app jar&gt; [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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用火花流计算流中的新元素

如何使用火花流处理实时流数据/日志?

带聚合的火花流

如何增加火花流接收器

为啥近实时调用火花流?

如何更新火花流中的广播变量?