Ошибка подтверждения отправки: 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.sbt
s. Чтобы исправить вашу проблему, я бы сделал вид, что вы не используете эту расширенную настройку 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
Вот и все.
Обратите внимание, что:
--deploy-mode cluster
слишком сложен для выполнения упражнения (давайте сделаем это простым и вернем его при необходимости)file://
делает вещи сломанными (или, по крайней мере, излишними)--class "Counter"
заботится оsbt package
когда у вас есть одно приложение Scala в проекте, где вы его выполняете. Вы можете спокойно пропустить это.