【问题标题】:KafkaUtils java.lang.NoClassDefFoundError Spark StreamingKafkaUtils java.lang.NoClassDefFoundError 火花流
【发布时间】:2017-01-12 08:27:07
【问题描述】:

我正在尝试通过 Spark 流打印从 Kafka 消耗的消息。但是,我一直遇到以下错误:

16/09/04 16:03:33 错误 ApplicationMaster: 用户类抛出异常: java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$

在 StackOverflow 上有人就这个问题提出了一些问题。例如:https://stackoverflow.com/questions/27710887/kafkautils-class-not-found-in-spark-streaming#=

给出的答案并没有为我解决这个问题。我曾尝试使用 sbt 程序集创建一个“超级 jar”,但这也不起作用。

sbt 文件内容:

name := "StreamKafka"

version := "1.0"

scalaVersion := "2.10.5"


libraryDependencies ++= Seq(
    "org.apache.kafka" % "kafka_2.10" % "0.8.2.1" % "provided",
    "org.apache.spark" % "spark-streaming_2.10" % "1.6.1" % "provided",
    "org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.1" % "provided",
    "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided" exclude("com.esotericsoftware.minlog", "minlog") exclude("com.esotericsoftware.kryo", "kryo")
)

resolvers ++= Seq(
    "Maven Central" at "https://repo1.maven.org/maven2/"
)


assemblyMergeStrategy in assembly := {
  case m if m.toLowerCase.endsWith("manifest.mf")          =>     MergeStrategy.discard
  case m if m.toLowerCase.matches("meta-inf.*\\.sf$")      =>     MergeStrategy.discard
  case "log4j.properties"                                  =>     MergeStrategy.discard
  case m if m.toLowerCase.startsWith("meta-inf/services/") =>     MergeStrategy.filterDistinctLines
  case "reference.conf"                                    =>     MergeStrategy.concat
  case _                                                   =>     MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith "pom.properties" =>  MergeStrategy.discard
  case x => val oldStrategy = (assemblyMergeStrategy in assembly).value
  oldStrategy(x)
}

【问题讨论】:

  • 提交作业的Spark节点是否必须安装Kafka?
  • 从 spark-streaming-kafka 中移除提供的
  • @vishnuviswanath 我删除了提供。仍然抛出相同的错误。
  • 对不起。您还必须从 kafka_2.10 中删除提供的
  • @vishnuviswanath 我试过了,但我仍然得到同样的错误:错误 ApplicationMaster:用户类抛出异常:java.lang.NoClassDefFoundError:org/apache/spark/streaming/kafka/KafkaUtils$。

标签: apache-spark sbt apache-kafka spark-streaming


【解决方案1】:

发布来自 cmets 的答案,以便其他人轻松解决问题。

您必须从 kafka 依赖项中删除“提供”

"org.apache.kafka" % "kafka_2.10" % "0.8.2.1" % "provided",
"org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.1" % "provided"

要在 jar 中捆绑依赖项,您必须运行命令 sbt assembly

还要确保您正在运行正确的 jar 文件。您可以通过检查 sbt 汇编命令的日志找到正确的 jar 文件名。

【讨论】:

    【解决方案2】:

    问这个问题可能有点傻,但是 streamkafka_‌​2.10-1.0.jar 是否包含 org/apache/spark/streaming/kafka/KafkaUtils.class

    【讨论】:

      【解决方案3】:

      只要集群在运行时提供 Kafka / Spark 类,就必须从组装的 JAR 中排除依赖项。如果没有,您应该会在应用程序启动期间从 Java 类加载器中看到类似这样的错误。

      没有依赖的程序集的另一个好处是更快的部署。如果集群在运行时提供依赖关系,最好的选择是使用 % "provided" 省略这些规范

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        相关资源
        最近更新 更多