KafkaUtils java.lang.NoClassDefFoundError Spark 流
KafkaUtils java.lang.NoClassDefFoundError Spark Streaming
我正在尝试打印通过 Spark 流从 Kafka 使用的消息。但是,我一直 运行 进入以下错误:
16/09/04 16:03:33 错误 ApplicationMaster:用户 class 抛出异常:java.lang.NoClassDefFoundError:org/apache/spark/streaming/kafka/KafkaUtils$
关于这个问题,Whosebug 上已经有人提出了一些问题。例如:
给出的答案并没有为我解决这个问题。我尝试使用 sbt assembly 创建一个 "uber 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)
}
这个问题可能有点傻,但是 streamkafka_ 2.10-1.0.jar 是否包含 org/apache/spark/streaming/kafka/KafkaUtils.class
将评论中的答案贴出来,方便其他人解决问题。
您必须从 kafka 依赖项中删除 "provided"
"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 文件名。
只要集群在运行时提供 Kafka / Spark classes,就必须从组装的 JAR 中排除依赖项。如果没有,您应该会在应用程序启动期间从 Java class-loader 中预料到类似这样的错误。
无依赖性组装的另一个好处是部署速度更快。如果集群在运行时提供依赖关系,最好的选择是使用 % "provided"
忽略这些体面
我正在尝试打印通过 Spark 流从 Kafka 使用的消息。但是,我一直 运行 进入以下错误:
16/09/04 16:03:33 错误 ApplicationMaster:用户 class 抛出异常:java.lang.NoClassDefFoundError:org/apache/spark/streaming/kafka/KafkaUtils$
关于这个问题,Whosebug 上已经有人提出了一些问题。例如:
给出的答案并没有为我解决这个问题。我尝试使用 sbt assembly 创建一个 "uber 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)
}
这个问题可能有点傻,但是 streamkafka_ 2.10-1.0.jar 是否包含 org/apache/spark/streaming/kafka/KafkaUtils.class
将评论中的答案贴出来,方便其他人解决问题。
您必须从 kafka 依赖项中删除 "provided"
"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 文件名。
只要集群在运行时提供 Kafka / Spark classes,就必须从组装的 JAR 中排除依赖项。如果没有,您应该会在应用程序启动期间从 Java class-loader 中预料到类似这样的错误。
无依赖性组装的另一个好处是部署速度更快。如果集群在运行时提供依赖关系,最好的选择是使用 % "provided"
忽略这些体面