web-dev-qa-db-ja.com

KafkaUtilsクラスがSparkストリーミングに見つかりません

Sparkストリーミングを始めたばかりで、Kafkaストリームから単語をカウントするサンプルアプリケーションを構築しようとしています。sbt packageでコンパイルされますが、実行すると、NoClassDefFoundErrorが表示されます。これ post も同じ問題があるようですが、解決策はMaven用であり、sbtで再現できませんでした。

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/"

そして私はそれを提出します:

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

エラー:

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)
10
kahlo

spark-submitは、KafkaUtilsを含むパッケージを自動的に配置しません。プロジェクトJARに含める必要があります。そのためには、 sbt Assembly を使用して、包括的なuber-jarを作成する必要があります。これはbuild.sbtの例です。

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

もちろん、アセンブリプラグインをSBTに追加する必要もあります。

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

17
Tathagata Das

アプリケーションを送信するときに、すべての依存関係jarを含めてみてください。

./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 spark-example-1.0 -SNAPSHOT.jar

7
Sandeep

次の_build.sbt_は私のために働いた。また、_sbt-Assembly_プラグインを_projects/_ディレクトリの下のファイルに配置する必要があります。

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

--packagesspark-submit引数を使用します。group:artifact:version,...の形式のmvnパッケージを取ります

0
Joseph Thomas

Spark 1.6を使用すると、非常に多くの外部jarを処理する手間をかけずに作業を行うことができます...管理が非常に複雑になる可能性があります...

0
Gi1ber7

同じ問題に対処するために、依存関係のあるjarをビルドすることで解決しました。

以下のコードをpom.xmlに追加します

<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パッケージは「example-jar-with-dependencies.jar」を送信します

0
Nilesh

また、jarファイルをダウンロードしてSpark libフォルダーに配置することもできます。これは、SBT build.sbtを動作させるために頭を殴る代わりに、Sparkがインストールされていないためです。

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

コピー先:

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

0
Walker Rowe

依存関係を外部に追加しました。プロジェクト->プロパティ-> Javaビルドパス->ライブラリ->外部jarを追加し、必要なjarを追加します。

これで私の問題は解決しました。

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

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"

これで問題が修正されます

0