KafkaUtils java.lang.NoClassDefFoundError Spark Streaming

时间:2016-09-05 00:22:28

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

我正在尝试通过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#=

给出的答案并没有为我解决这个问题。我试过创造一个" uber jar"使用sbt程序集,但也无法正常工作。

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)
}

3 个答案:

答案 0 :(得分:1)

发表评论的答案,以便其他人轻松解决问题。

您必须从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 assembly命令的日志找到正确的jar文件名。

答案 1 :(得分:0)

这可能很愚蠢,但streamkafka_ 2.10-1.0.jar是否包含org / apache / spark / streaming / kafka / KafkaUtils.class

答案 2 :(得分:0)

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

不依赖程序集的其他好处是部署速度更快。如果集群在运行时提供了依赖关系,那么最好使用%“ provided”来省略这些依赖关系。