我想要运行spark streaming示例: Directkafkawordcount.scala
要创建jar,我使用带有插件的“build.sbt”:
name := "Kafka Direct"
version := "1.0"
scalaVersion := "2.11.6"
libraryDependencies ++= Seq ("org.apache.spark" % "spark-streaming-kafka-0-8_2.11" % "2.1.0",
"org.apache.spark" % "spark-streaming_2.11" % "2.1.0",
"org.apache.spark" % "spark-core_2.11" % "2.1.0" exclude("com.esotericsoftware.minlog", "minlog")
)
resolvers ++= Seq(
"Maven Central" at "https://repo1.maven.org/maven2/"
)
mergeStrategy 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)
}
“sbt package”成功但是当我想从target / scala-2.11 / classes目录提交时: “spark-submit --class org.apache.spark.examples.streaming.DirectKafkaWordCount --master local [2] /home/hadoop/DirectKafkaProject/target/scala-2.11/kafka-direct_2.11-1.0.jar localhost:9092 XYZ123"
它给了我这个错误:
引起:java.lang.ClassNotFoundException:org.apache.spark.streaming.kafka.KafkaUtils $ 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)
我已经设置了SPARK_CLASSPATH和SPARK_LOCAL_IP。我已经尝试使用-jars选项,但它要求另一个.jar文件并且它一直在询问其他.jar文件。我已经完成了每个网站建议的所有事情,但我无法解决我的问题。 Scala版本:2.11.6 spark版本:2.1.0 kafka版本:2.11-0.10.2.0。
请帮帮我。感谢。
答案 0 :(得分:0)
tl; dr sbt assembly
和spark-submit
sbt assembly
汇总了一个jar文件中的所有依赖项,并且您使用了Kafka的外部库,这就是我推荐的内容。
您已经在build.sbt
中获得了sbt-assembly插件的定义,这表明它已经成为可能。
执行已组装的Spark应用程序正在使用spark-submit
命令行应用程序,如下所示:
bin/spark-submit \
--class org.apache.spark.examples.streaming.DirectKafkaWordCount \
--master local[2] \
target/scala-2.11/StreamKafkaProg-assembly-1.0.jar localhost:9092 rat123
答案 1 :(得分:0)
以防万一有人偶然发现了这篇文章(就像我一样)。 Jacek的答案非常正确。对我来说,它仍然没有用,因为合并策略至关重要(并且我使用了一些来自互联网的示例)。
适用于我的最简单的表单(假设您只有spark
和spark-sql-kafka
等)
assemblyMergeStrategy in assembly := {
case PathList("org", "apache", "spark", "unused", "UnusedStubClass.class") => MergeStrategy.first
case x => (assemblyMergeStrategy in assembly).value(x)
}