Spark - Fehler "In Ihrer Konfiguration muss eine Master-URL festgelegt sein" beim Senden einer App

92

Ich habe eine Spark-App, die im lokalen Modus problemlos ausgeführt wird, aber beim Senden an den Spark-Cluster einige Probleme hat.

Die Fehlermeldung lautet wie folgt:

16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 2.0 in stage 0.0 (TID 2, cluster-node-02): java.lang.ExceptionInInitializerError
    at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
    at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
    at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
    at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.spark.SparkException: A master URL must be set in your configuration
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:401)
    at GroupEvolutionES$.<init>(GroupEvolutionES.scala:37)
    at GroupEvolutionES$.<clinit>(GroupEvolutionES.scala)
    ... 14 more

16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 5.0 in stage 0.0 (TID 5, cluster-node-02): java.lang.NoClassDefFoundError: Could not initialize class GroupEvolutionES$
    at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
    at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
    at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
    at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Im obigen Code GroupEvolutionESist die Hauptklasse. Die Fehlermeldung lautet "Eine Master-URL muss in Ihrer Konfiguration festgelegt sein", aber ich habe den Parameter "--master" für angegeben spark-submit.

Wer weiß, wie man dieses Problem behebt?

Spark-Version: 1.6.1

Shuai Zhang
quelle
1
Könnten Sie bitte den Befehl hier einfügen, mit dem Sie das Skript senden.
Shiv4nsh
Haben Sie die Spark-Master-URL angegeben?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULSHRESTHA Ja.
Shuai Zhang
Darauf bin ich in Sparkden Unit-Tests meines Projekts gestoßen ( DataFrameSuiteBase). Aus @Dazzlers Antwort ging hervor, dass ich die DataFrameKreation in test(..) { .. }Suiten bewegen muss . Aber auch nur zu erklären, dass DataFrames daslazy Problem ist (Liebe Scala!). Dies hat darauf hingewiesen, gewesen @gyuseong in seiner Antwort unten
y2k-shubham

Antworten:

39

Wo ist das sparkContext-Objekt definiert, befindet es sich innerhalb der Hauptfunktion?

Auch ich hatte das gleiche Problem. Der Fehler, den ich gemacht habe, war, dass ich den sparkContext außerhalb der Hauptfunktion und innerhalb der Klasse initiiert habe.

Als ich es innerhalb der Hauptfunktion initiierte, funktionierte es einwandfrei.

Dazzler
quelle
11
Spark muss wirklich verbessert werden: Es zeigt nur sehr verwirrende und nicht informative Fehlermeldungen, wenn etwas falsch passiert
Shuai Zhang
3
Dies ist eine Problemumgehung und keine Lösung. Was ist, wenn ich einen Singletion-Kontext erstellen und eine separate Kontextebene neben der Hauptfunktion für mehrere Anwendungen erstellen möchte?
Murtaza Kanchwala
1
"Beachten Sie, dass Anwendungen eine main()Methode definieren sollten, anstatt sie zu erweitern scala.App. Unterklassen von scala.Appfunktionieren möglicherweise nicht richtig." Spark 2.1.0 Manual
ruhong
Achten Sie darauf, wo Sie versuchen, getOrCreate()einen Kontext auf Treiberebene zu erstellen und bei Bedarf an die Executorebene weiterzuleiten.
Reim
130

Die TLDR:

.config("spark.master", "local")

eine Liste der Optionen für spark.master in spark 2.2.1

Ich bin auf dieser Seite gelandet, nachdem ich versucht hatte, ein einfaches Spark SQL-Java-Programm im lokalen Modus auszuführen. Zu diesem Zweck stellte ich fest, dass ich spark.master mit folgenden Einstellungen festlegen konnte:

SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.master", "local")
.getOrCreate();

Ein Update zu meiner Antwort:

Dies ist in einer Produktionsumgebung nicht das, was Sie tun sollten. In einer Produktionsumgebung sollte spark.master an einer von mehreren anderen Stellen angegeben werden: entweder in $ SPARK_HOME / conf / spark-defaults.conf (hier wird es von Cloudera Manager abgelegt) oder in der Befehlszeile, wenn Sie es senden die App. (ex Spark-Submit - Master-Garn).

Wenn Sie spark.master auf diese Weise als 'lokal' angeben, versucht spark, in einem einzelnen JVM ausgeführt zu werden, wie in den Kommentaren unten angegeben. Wenn Sie dann versuchen, --deploy-mode cluster anzugeben, wird die Fehlermeldung angezeigt, dass der Cluster-Bereitstellungsmodus nicht mit dem Master "local" kompatibel ist. Dies liegt daran, dass das Setzen von spark.master = local bedeutet, dass Sie NICHT im Cluster-Modus ausgeführt werden.

Stattdessen sollten Sie für eine Produktions-App innerhalb Ihrer Hauptfunktion (oder in Funktionen, die von Ihrer Hauptfunktion aufgerufen werden) einfach Folgendes verwenden:

SparkSession
.builder()
.appName("Java Spark SQL basic example")
.getOrCreate();

Hierbei werden die in der Befehlszeile / in den Konfigurationsdateien angegebenen Konfigurationen verwendet.

Um dies auch klar zu machen: --master und "spark.master" sind genau dieselben Parameter, die nur auf unterschiedliche Weise angegeben wurden. Das Setzen von spark.master im Code, wie in meiner obigen Antwort, überschreibt Versuche, --master festzulegen, und überschreibt Werte in der spark-defaults.conf. Tun Sie dies also nicht in der Produktion. Es ist großartig für Tests.

Siehe auch diese Antwort . die Links zu einer Liste der Optionen für spark.master und was jeder tatsächlich tut.

eine Liste der Optionen für spark.master in spark 2.2.1

Jack Davidson
quelle
5
Ja, das Hinzufügen von ".config (" spark.master "," local ")" hat auch bei mir funktioniert.
Ashutosh S
Danke, das hat bei mir funktioniert - aber könnte jemand einem Neuling (mir) erklären, was die .config ("spark.master", "local") tut? Ist mein Code immer noch in Ordnung, um ihn in ein Glas zu kompilieren und in der Produktion auszuführen?
user1761806
4
@ user1761806 Während viele der Antworten dies als Korrektur melden, ändert es die Art und Weise, wie Funken verarbeitet werden, grundlegend, indem nur eine einzige JVM verwendet wird. Local wird für lokale Tests verwendet und ist nicht die richtige Lösung, um dieses Problem zu beheben, wenn Sie beabsichtigen, es in einem Cluster bereitzustellen. Ich hatte ähnliche Probleme und die akzeptierte Antwort war die richtige Lösung für mein Problem.
Nathaniel Wendt
58

Arbeitete für mich nach dem Ersetzen

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");

mit

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Diese Lösung wurde in einem anderen Thread im Stackoverflow gefunden.

Sachin
quelle
1
Sie, Sir, haben meinen Tag gerettet ... Danke!
Hako
3
Löst dies die Frage des OP? Dadurch wird in dieser JVM ein lokaler Cluster erstellt, der an keiner anderen Stelle mit einem eigenständigen Cluster verbunden ist.
Azeroth2b
Dies löst das Problem. Ich weiß (noch) nicht über die Auswirkungen von setMaster("local[2]")(wäre schön, eine Erklärung zu haben), aber diese Antwort kann als Lösung für das Problem angesehen werden.
Rick
Ich habe gerade die Antwort bearbeitet, um diese Informationen aufzunehmen :)
Rick
26

Der Standardwert von "spark.master" ist spark: // HOST: PORT. Der folgende Code versucht, eine Sitzung von dem eigenständigen Cluster abzurufen , der bei HOST: PORT ausgeführt wird , und erwartet, dass sich der Wert für HOST: PORT im befindet Spark-Konfigurationsdatei.

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .getOrCreate();

" org.apache.spark.SparkException: In Ihrer Konfiguration muss eine Master-URL festgelegt sein " besagt, dass HOST: PORT nicht in der Spark-Konfigurationsdatei festgelegt ist.

Um den Wert von "HOST: PORT" nicht zu beeinträchtigen , setzen Sie spark.master als lokal

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .config("spark.master", "local")
    .getOrCreate();

Hier ist der Link für die Liste der Formate, in denen die Master-URL an spark.master übergeben werden kann

Referenz: Spark Tutorial - Spark Ecosystem einrichten

Mallikarjun M.
quelle
Vielen Dank, dass du meinen Tag gerettet hast!
GentleCoder
6

Wenn Sie eine eigenständige Anwendung ausführen, müssen Sie SparkContextstattdessen verwendenSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
quelle
5
.setMaster("local")ist der Schlüssel, um das Problem für mich zu lösen
tom10271
Was ist, wenn ich es eingestellt habe, aber immer noch diesen Fehler habe? @ tom10271
Anna Leonenko
@AnnaLeonenko Es tut mir leid, aber ich habe die Entwicklung der Spark-Anwendung bereits seit einem Jahr eingestellt. Ich kann mich nicht an mein Gedächtnis erinnern. Aber ich denke, Ihr Hauptknoten ist nicht lokal, was durch Funken, sondern durch Garn verwaltet wird?
tom10271
1
@AnnaLeonenko Ich habe meine Einstellungen überprüft. Wenn ich es lokal für die Entwicklung ausgeführt habe und Spark nur zum Verwalten des Masterknotens verwende, werde ich es auf localoder setzen local[*]. Wenn ich es für AWS EMR bereitstelle, wird Garn zur Koordination verwendet, und dann setze ich den Master aufyarn
tom10271
6

Fügen .setMaster("local")Sie einfach Ihren Code wie unten gezeigt hinzu:

val conf = new SparkConf().setAppName("Second").setMaster("local") 

Es hat bei mir funktioniert! Viel Spaß beim Codieren!

Kumar Sanu
quelle
3

Wie wählt der Funkenkontext in Ihrer Anwendung den Wert für den Funkenmaster aus?

  • Sie können es entweder explizit SparkConfbeim Erstellen von SC bereitstellen .
  • Oder es wählt aus dem System.getProperties(wo SparkSubmit es früher nach dem Lesen Ihres --masterArguments gesetzt hat).

Läuft jetzt SparkSubmitauf dem Treiber - in Ihrem Fall auf dem Computer, auf dem Sie das spark-submitSkript ausführen . Und das funktioniert wahrscheinlich auch für Sie wie erwartet.

Aus den von Ihnen veröffentlichten Informationen geht jedoch hervor, dass Sie in dem Code, der an den Executor gesendet wird, einen Spark-Kontext erstellen. Da dort keine spark.masterSystemeigenschaft verfügbar ist, schlägt dies fehl. (Und das sollten Sie eigentlich nicht tun, wenn dies der Fall ist.)

Können Sie bitte den GroupEvolutionESCode posten (speziell dort, wo Sie ihn erstellen SparkContext(s)) ?

Sachin Tyagi
quelle
1
Ja. Ich hätte den SparkContext in den mainFunktionen von GroupEvolutionES erstellen sollen (was ich nicht getan habe).
Shuai Zhang
1
Dies ist eine Problemumgehung und keine Lösung. Was ist, wenn ich einen Singletion-Kontext erstellen und eine separate Kontextebene neben der Hauptfunktion für mehrere Anwendungen erstellen möchte? Irgendwelche Kommentare, wie ich es erreichen kann?
Murtaza Kanchwala
2

Ersetzen:

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");
WITH
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Hat die Magie.

Nazima
quelle
5
Ist Ihre Lösung nicht genau die gleiche wie die von @Sachin?
Akavall
warum lokal [2] können Sie erklären
SUDARSHAN
über lokale [2] -> stackoverflow.com/questions/32356143/…
Raevilman
2

Ich hatte das gleiche Problem. Hier ist mein Code vor der Änderung:

package com.asagaama

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD

/**
  * Created by asagaama on 16/02/2017.
  */
object Word {

  def countWords(sc: SparkContext) = {
    // Load our input data
    val input = sc.textFile("/Users/Documents/spark/testscase/test/test.txt")
    // Split it up into words
    val words = input.flatMap(line => line.split(" "))
    // Transform into pairs and count
    val counts = words.map(word => (word, 1)).reduceByKey { case (x, y) => x + y }
    // Save the word count back out to a text file, causing evaluation.
    counts.saveAsTextFile("/Users/Documents/spark/testscase/test/result.txt")
  }

  def main(args: Array[String]) = {
    val conf = new SparkConf().setAppName("wordCount")
    val sc = new SparkContext(conf)
    countWords(sc)
  }

}

Und nach dem Ersetzen:

val conf = new SparkConf().setAppName("wordCount")

Mit:

val conf = new SparkConf().setAppName("wordCount").setMaster("local[*]")

Es hat gut funktioniert!


quelle
2
var appName:String ="test"
val conf = new SparkConf().setAppName(appName).setMaster("local[*]").set("spark.executor.memory","1g");
val sc =  SparkContext.getOrCreate(conf)
sc.setLogLevel("WARN")
Rio
quelle
Diese Lösung hat bei mir funktioniert. Danke, dass du es aufgestellt hast. @Mario.
Siwoku Adeola
2

Versuche dies

Merkmal machen

import org.apache.spark.sql.SparkSession
trait SparkSessionWrapper {
   lazy val spark:SparkSession = {
      SparkSession
        .builder()
        .getOrCreate()
    }
}

erweitert es

object Preprocess extends SparkSessionWrapper {
Gyuseong
quelle
1

Es fehlt der zu setzende setMaster ("local [*]") . Sobald wir hinzugefügt haben, wird das Problem behoben.

Problem:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .getOrCreate()

Lösung:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .master("local[*]")
      .getOrCreate()
KARTHIKEYAN.A
quelle
0

Wenn Sie folgenden Code verwenden

 val sc = new SparkContext(master, "WordCount", System.getenv("SPARK_HOME"))

Dann durch folgende Zeilen ersetzen

  val jobName = "WordCount";
  val conf = new SparkConf().setAppName(jobName);
  val sc = new SparkContext(conf)

In Spark 2.0 können Sie folgenden Code verwenden

val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .master("local[*]")// need to add
  .getOrCreate()

Sie müssen .master ("local [*]") hinzufügen, wenn das Ausführen von local hier * alle Knoten bedeutet. Sie können insted of 8 1,2 usw.

Sie müssen die Master-URL festlegen, wenn Sie sich im Cluster befinden

Vaquar Khan
quelle
0

Wenn Sie in JavaSparkContext keine Spark-Konfiguration bereitstellen, wird dieser Fehler angezeigt. Das heißt: JavaSparkContext sc = neuer JavaSparkContext ();

Lösung: Stellen Sie JavaSparkContext bereit sc = new JavaSparkContext (conf);

Rimi Gandhi
quelle