Wie kann Sie Einreichen, einen job zu Funken vom code?

Habe ich gesponnen, bis eine single-node-standalone-Spark-cluster und bestätigte meine build funktioniert mit ./bin/run-example SparkPi 10. Dann schrieb ich einen wirklich einfachen test-Projekt in scala;

import org.apache.spark.{SparkConf, SparkContext}

object Main {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
    val sc = new SparkContext("spark://UbuntuVM:7077", "Simple Application")

    val count = sc.parallelize(1 to 100).map{i =>
      val x = Math.random()
      val y = Math.random()
      if (x*x + y*y < 1) 1 else 0
    }.reduce(_ + _)
    println("Pi is roughly " + 4.0 * count / 100)
  }
}

Ich bin mit diesem aus in meine IDE (IntelliJ). Es verbindet sich mit dem cluster erfolgreich, und ich sehe es jobs, aber Sie alle einen Fehler auslösen;

INFO TaskSetManager: Lost task 1.3 in stage 0.0 (TID 7) on executor 192.168.1.233: java.lang.ClassNotFoundException (Main$$anonfun$1) [duplicate 7]

Wenn ich verstehe, Funken richtig, das ist, weil die cluster nicht finden können, der code. So wie füttere ich den code zu Funken? Ich bin mir nicht läuft HDFS oder irgendetwas in diesem test, aber es ist alles auf einer box, so dass ich erwartet hätte SparkContext zu übergeben, das aktuelle Verzeichnis zu Funken, aber es offenbar nicht.

Kann jemand Punkt mich auf den richtigen Weg, um dies einzurichten?

  • Möglich, Duplikat der Wie machen es einfacher zu implementieren ist mein Glas Spark-Cluster im eigenständigen Modus?
  • Ich versuchte wirklich sc.addJar(SparkContext.jarOfClass(dies.getClass).bekommen) – aber natürlich ist dies nicht, denn es gibt keine JAR.. IntelliJ ist nicht die Schaffung einer..
  • sbt-Montage funktioniert, zu produzieren, ein JAR ich kann die Funke zu senden, aber ich kann immer noch nicht finden, einen Weg, um das „ausführen“ – Funktion in intelliJ laufen, nur die Sache..
  • Erstellen von jar-Artefakt Konfiguration für Ihr Projekt in IntelliJ öffnen Sie dann Ihre Konfiguration auszuführen, und fügen Sie „build-Artefakt“ die „vor dem Start“ Abschnitt. sc.addJar sollte enthalten vollständige Pfad zu Ihrem Artefakt. Dies ist eine Entwicklung, die Einrichtung, nicht für die Produktion Verwendung.
  • Also vielleicht bin ich auch nur blind, aber ich sehe nicht ein Weg, um ein build-Artefakt, das tatsächlich Folgen die sbt-Montage-setup (ohne das spark-Kram zum Beispiel)?
  • 1. Sie können hinzufügen oder entfernen Sie alle Artefakt-Abhängigkeiten auf Artefakt Registerkarte „Einstellungen“. 2. Tatsächlich, auf den zweiten Gedanken, die Sie nicht brauchen Artefakt an alle, die Sie hinzufügen können sbt-Befehl, um die „vor Start“ Abschnitt in Ihrer Konfiguration auszuführen. Fügen Sie einfach „Versammlung“ gibt.

InformationsquelleAutor XeroxDucati | 2016-05-06



3 Replies
  1. 1

    Wenn Sie möchten, testen Sie Ihre Spark-Programm lokal, Sie brauchen noch nicht einmal zu drehen, die single-node-standalone-Spark. Setzen Sie einfach Ihr master-url zu local[*] wie diese

    val sc = new SparkContext("local[*]", "Simple Application", sparkConf)

    Dann im sbt geben > run um das Programm auszuführen (dies sollte die gleiche wie die von IntelliJ, aber ich verwendet, um führen Sie das Programm aus dem terminal mit sbt).

    Da können Sie nicht wollen, ändern Sie Ihr master-url im code zwischen local[*] und spark://... viele Male, können Sie lassen Sie die Felder leer,

    val sc = new SparkContext(new SparkConf())

    und stellen Sie Ihre java-Eigenschaften beim laufen, zum Beispiel, in build.sbt können Sie hinzufügen

    javaOptions := Seq("-Dspark.master=local[*]", "-Dspark.app.name=my-app")

    und führen Sie es mit run im sbt.


    Zu einem mehr umfassenden lokalen-Modus erleben, möchten Sie vielleicht fügen Sie die folgenden Zeilen in Ihre build.sbt

    run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
    runMain in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
    fork := true
    javaOptions := Seq("-Dspark.master=local[*]", s"-Dspark.app.name=my-app")
    outputStrategy := Some(StdoutOutput)

    Wir haben eine sbt-plugin, das diese Einstellungen für Sie, es kann Ihnen auch helfen Sie stellen eine eigenständige Spark-cluster auf cloud-system wie aws ec2, geben Sie einen Blick auf spark-deployer wenn Sie interessiert sind.

  2. 1

    Ihnen fehlt ein entscheidender Schritt:

    org.apache.spark.deploy.SparkSubmit

    https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala

    die tatsächlich übergibt einen Auftrag an den cluster. Leider gibt es derzeit keine solide wrapper für die es außer für spark-submit. So gibt es derzeit keine zuverlässige Möglichkeit, programmgesteuert senden spark-jobs. Es ist ein jira-denn das war teilweise angesprochen Feb 2015: aber es fehlt Dokumentation.

     https://github.com/apache/spark/pull/3916/files

    Liegt die Schwierigkeit in der Komplexität der Umwelt Machenschaften zur Verfügung gestellt von spark-submit. Es wurde nicht gefunden möglich zu replizieren, die ausschließlich innerhalb von scala/java-code.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.