Ошибка подтверждения отправки: ClassNotFoundException

build.sbt

lazy val commonSettings = Seq(
    organization := "com.me",
    version := "0.1.0",
    scalaVersion := "2.11.0"
)

lazy val counter = (project in file("counter")).
    settings(commonSettings:_*)

Счетчик / build.sbt

name := "counter"
mainClass := Some("Counter")
scalaVersion := "2.11.0"

val sparkVersion = "2.1.1";

libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided";
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided";
libraryDependencies += "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided";

libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.2";
libraryDependencies += "org.apache.spark" %% "spark-streaming-kafka-0-8" % sparkVersion;

libraryDependencies += "com.github.scopt" %% "scopt" % "3.5.0";

libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1";
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test";

mergeStrategy in assembly := {
  case PathList("org", "apache", "spark", "unused", "UnusedStubClass.class") => MergeStrategy.first
  case x => (mergeStrategy in assembly).value(x)
}

counter.scala:

object Counter extends SignalHandler
{
    var ssc : Option[StreamingContext] = None;
    def main( args: Array[String])

Бежать

./spark-submit --class "Counter" --master spark://10.1.204.67:6066 --deploy-mode cluster file://counter-assembly-0.1.0.jar

Ошибка:

17/06/21 19:00:25 INFO Utils: Successfully started service 'Driver' on port 50140.
17/06/21 19:00:25 INFO WorkerWatcher: Connecting to worker spark://Worker@10.1.204.57:52476
Exception in thread "main" java.lang.ClassNotFoundException: Counter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:229)
    at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:56)
    at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)

Любая идея? Спасибо

ОБНОВИТЬ

У меня возникла проблема. Не удалось отправить локальный jar в кластер spark: java.nio.file.NoSuchFileException. Теперь я скопировал банку в spark-2.1.0-bin-hadoop2.7/bin а потом беги ./spark-submit --class "Counter" --master spark://10.1.204.67:6066 --deploy-mode cluster file://Counter-assembly-0.1.0.jar

Искровой кластер 2.1.0

Но баночка была собрана в 2.1.1 и Scala 2.11.0.

1 ответ

Похоже, что вы только начали разрабатывать приложения Spark для Scala, поэтому с единственной целью помочь вам и другим будущим разработчикам Spark, я надеюсь дать вам достаточно шагов, чтобы начать работу с окружением.

Конфигурация сборки проекта - build.sbt

Похоже, что вы используете многопроектную сборку sbt, и поэтому у вас есть два build.sbts. Чтобы исправить вашу проблему, я бы сделал вид, что вы не используете эту расширенную настройку sbt.

Похоже, что вы используете Spark Streaming, поэтому определите его как зависимость (как libraryDependencies). Вам не нужно определять другие зависимости Spark (например, spark-core или же spark-sql).

У тебя должно быть build.sbt следующее:

organization := "com.me"
version := "0.1.0"
scalaVersion := "2.11.0"
val sparkVersion = "2.1.1"
libraryDependencies += "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided"

Сборка развертываемого пакета

С build.sbt выше, вы выполняете sbt package создать развертываемый пакет приложений Spark, который вы в конечном итоге spark-submit в кластер искр.

Вам не нужно использовать sbt assembly для этого... пока. Я вижу, что вы используете Spark Cassandra Connector и другие зависимости, которые также могут быть определены с помощью --packages или же --jars вместо этого (которые сами по себе имеют свои плюсы и минусы).

sbt package

Размер финала target/scala-2.11/counter_2.11-0.1.0.jar будет намного меньше, чем counter-assembly-0.1.0.jar вы построили, используя sbt assembly так как sbt package не включает зависимости в одном файле jar. Это ожидается и хорошо.

Отправка Spark Заявки - spark-submit

После sbt package вы должны иметь развертываемый пакет в target/scala-2.11 как counter-assembly-0.1.0.jar,

Вы должны просто spark-submit с необходимыми опциями, которые в вашем случае будут:

spark-submit \
  --master spark://10.1.204.67:6066
 target/scala-2.11/counter-assembly-0.1.0.jar

Вот и все.


Обратите внимание, что:

  1. --deploy-mode cluster слишком сложен для выполнения упражнения (давайте сделаем это простым и вернем его при необходимости)

  2. file:// делает вещи сломанными (или, по крайней мере, излишними)

  3. --class "Counter" заботится о sbt package когда у вас есть одно приложение Scala в проекте, где вы его выполняете. Вы можете спокойно пропустить это.

Другие вопросы по тегам