web-dev-qa-db-de.com

KafkaUtils-Klasse in Spark-Streaming nicht gefunden

Ich habe gerade mit Spark Streaming begonnen und versuche, eine Beispielanwendung zu erstellen, die Wörter aus einem Kafka-Stream zählt. Obwohl es mit sbt package kompiliert wird, erhalte ich beim Ausführen NoClassDefFoundError. Dieses post scheint dasselbe Problem zu haben, aber die Lösung ist für Maven und ich konnte es nicht mit sbt reproduzieren.

KafkaApp.scala:

import org.Apache.spark._
import org.Apache.spark.streaming._
import org.Apache.spark.streaming.kafka._

object KafkaApp {
  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("kafkaApp").setMaster("local[*]")
    val ssc = new StreamingContext(conf, Seconds(1))
    val kafkaParams = Map(
        "zookeeper.connect" -> "localhost:2181",
        "zookeeper.connection.timeout.ms" -> "10000",
        "group.id" -> "sparkGroup"
    )

    val topics = Map(
        "test" -> 1
    )

    // stream of (topic, ImpressionLog)
    val messages = KafkaUtils.createStream(ssc, kafkaParams, topics, storage.StorageLevel.MEMORY_AND_DISK)
    println(s"Number of words: %{messages.count()}")
  }
}

build.sbt:

name := "Simple Project"

version := "1.1"

scalaVersion := "2.10.4"

libraryDependencies ++= Seq(
    "org.Apache.spark" %% "spark-core" % "1.1.1",
    "org.Apache.spark" %% "spark-streaming" % "1.1.1",
    "org.Apache.spark" %% "spark-streaming-kafka" % "1.1.1"
)

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

Und ich gebe es mit:

bin/spark-submit \
  --class "KafkaApp" \
  --master local[4] \
  target/scala-2.10/simple-project_2.10-1.1.jar

Error:

14/12/30 19:44:57 INFO AkkaUtils: Connecting to HeartbeatReceiver: akka.tcp://[email protected]:65077/user/HeartbeatReceiver
Exception in thread "main" Java.lang.NoClassDefFoundError: org/Apache/spark/streaming/kafka/KafkaUtils$
    at KafkaApp$.main(KafkaApp.scala:28)
    at KafkaApp.main(KafkaApp.scala)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.Apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:329)
    at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: Java.lang.ClassNotFoundException: org.Apache.spark.streaming.kafka.KafkaUtils$
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:366)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:355)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:354)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:425)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:358)
9
kahlo

spark-submit legt das Paket mit KafkaUtils nicht automatisch ab. Sie müssen in Ihrem Projekt JAR haben. Dafür müssen Sie ein All-Inclusive-Uber-Jar mit sbt Assembly erstellen. Hier ist ein Beispiel für build.sbt. 

https://github.com/tdas/spark-streaming-external-projects/blob/master/kafka/build.sbt

Sie müssen natürlich auch das Assembly-Plugin zu SBT hinzufügen. 

https://github.com/tdas/spark-streaming-external-projects/tree/master/kafka/project

16
Tathagata Das

Bitte versuchen Sie es, indem Sie alle abhängigen Gläser während der Bewerbung einschließen:

./spark-submit - name "SampleApp" --deploy-mode-Client - master spark: // Host: 7077 --class com.stackexchange.SampleApp --jars $ SPARK_INSTALL_DIR/spark-streaming-kafka_2.10-1.3 .0.jar, $ KAFKA_INSTALL_DIR/libs/kafka_2.10-0.8.2.0.jar, $ KAFKA_INSTALL_DIR/libs/metrics-core-2.2.0.jar, $ KAFKA_INSTALL_DIR/libs/zkclient-0.3.jar funken-beispiel-1.0 -SNAPSHOT.jar

7
Sandeep

Folgender build.sbt arbeitete für mich. Sie müssen das sbt-Assembly-Plugin auch in einer Datei unter dem projects/-Verzeichnis ablegen.

build.sbt

name := "NetworkStreaming" // https://github.com/sbt/sbt-Assembly/blob/master/Migration.md#upgrading-with-bare-buildsbt

libraryDependencies ++= Seq(
  "org.Apache.spark" % "spark-streaming_2.10" % "1.4.1",
  "org.Apache.spark" % "spark-streaming-kafka_2.10" % "1.4.1",         // kafka
  "org.Apache.hbase" % "hbase" % "0.92.1",
  "org.Apache.hadoop" % "hadoop-core" % "1.0.2",
  "org.Apache.spark" % "spark-mllib_2.10" % "1.3.0"
)

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
}

project/plugins.sbt

addSbtPlugin("com.eed3si9n" % "sbt-Assembly" % "0.14.1")

2
Vibhuti

verwenden --packages Argument zu spark-submit, es dauert MVN-Paket im Format group:artifact:version,...

0
Joseph Thomas

Mit Spark 1.6 erledigen Sie die Arbeit für mich, ohne sich um so viele externe Gläser kümmern zu müssen. 

0
Gi1ber7

das gleiche Problem zu erfüllen, habe ich es gelöst, indem ich das Glas mit Abhängigkeiten aufbaute.

fügen Sie den Code unten in pom.xml hinzu

<build>
    <sourceDirectory>src/main/Java</sourceDirectory>
    <testSourceDirectory>src/test/Java</testSourceDirectory>
    <plugins>
      <!--
                   Bind the maven-Assembly-plugin to the package phase
        this will create a jar file without the storm dependencies
        suitable for deployment to a cluster.
       -->
      <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass></mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-Assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>    

mvn package übergibt die "example-jar-with-dependencies.jar"

0
Nilesh

Sie können auch die JAR-Datei herunterladen und in den Spark-lib-Ordner legen, da sie nicht mit Spark installiert ist, anstatt Ihren Kopf zu schlagen, indem Sie versuchen, SBT build.sbt zu nutzen.

http://central.maven.org/maven2/org/Apache/spark/spark-streaming-kafka-0-10_2.10/2.1.1/spark-streaming-kafka-0-10_2.10-2.1. 1. jar

kopiere es nach:

/usr/local/spark/spark-2.1.0-bin-hadoop2.6/jars/

0
Walker Rowe

Die Abhängigkeit extern wurde hinzugefügt, Projekt -> Eigenschaften -> Java-Erstellungspfad -> Bibliotheken -> Externe Jars hinzufügen und die erforderliche Jar hinzufügen.

das löste mein Problem. 

0
Suresh
import org.Apache.spark.streaming.kafka.KafkaUtils

verwenden Sie das folgende in build.sbt


name := "kafka"

version := "0.1"

scalaVersion := "2.11.12"

retrieveManaged := true

fork := true

//libraryDependencies += "org.Apache.spark" % "spark-streaming_2.11" % "2.2.0"
//libraryDependencies += "org.Apache.spark" % "spark-streaming-kafka-0-8_2.11" % "2.1.0"

libraryDependencies += "org.Apache.spark" %% "spark-core" % "2.2.0"

//libraryDependencies += "org.Apache.spark" %% "spark-sql" % "2.2.0"

libraryDependencies += "org.Apache.spark" %% "spark-streaming" % "2.2.0"

// https://mvnrepository.com/artifact/org.Apache.spark/spark-streaming-kafka-0-8
libraryDependencies += "org.Apache.spark" %% "spark-streaming-kafka-0-8" % "2.2.0" % "provided"

// https://mvnrepository.com/artifact/org.Apache.spark/spark-streaming-kafka-0-8-Assembly
libraryDependencies += "org.Apache.spark" %% "spark-streaming-kafka-0-8-Assembly" % "2.2.0"

Dies wird das Problem beheben

0