Hello,
I have a simple Kafka Spark Streaming example which I am still developing
in the standalone mode.
Here is what is puzzling me,
If I build the assembly jar, use bin/spark-submit to run it, it works fine.
But if I want to run the code from within Intellij IDE, then it will cry
for this error
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/spark/SparkConf
...
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf
Here is my build.sbt file
import _root_.sbt.Keys._
import _root_.sbtassembly.Plugin.AssemblyKeys._
import _root_.sbtassembly.Plugin.MergeStrategy
import _root_.sbtassembly.Plugin._
import AssemblyKeys._
assemblySettings
name := "test-kafka"
version := "1.0"
scalaVersion := "2.10.4"
jarName in assembly := "test-kafka-1.0.jar"
assemblyOption in assembly ~= { _.copy(includeScala = false) }
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.2.1" % "provided",
"org.apache.spark" %% "spark-streaming" % "1.2.1" % "provided",
("org.apache.spark" %% "spark-streaming-kafka" % "1.2.1").
exclude("commons-beanutils", "commons-beanutils").
exclude("commons-collections", "commons-collections").
exclude("com.esotericsoftware.minlog", "minlog").
exclude("commons-logging", "commons-logging")
)
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
case x if x.startsWith("META-INF/ECLIPSEF.RSA") => MergeStrategy.last
case x if x.startsWith("META-INF/mailcap") => MergeStrategy.last
case x if x.startsWith("plugin.properties") => MergeStrategy.last
case x => old(x)
}
}
I also have this in my project/plugins.sbt
resolvers += Resolver.url("sbt-plugin-releases-scalasbt",
url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/";))
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4")
*What is even more interesting is that if I pin the Spark jar to 1.1.1
instead of 1.2.1, then I can successfully run it within IntelliJ. *