Spark - Errore "È necessario impostare un URL principale nella configurazione" quando si invia un'app


93

Ho un'app Spark che funziona senza problemi in modalità locale, ma ho alcuni problemi durante l'invio al cluster Spark.

I messaggi di errore sono i seguenti:

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)

Nel codice sopra, GroupEvolutionESè la classe principale. Il messaggio di errore dice "È necessario impostare un URL principale nella configurazione", ma ho fornito il parametro "--master" a spark-submit.

Qualcuno che sa come risolvere questo problema?

Versione Spark: 1.6.1


1
Potresti incollare qui il comando che stai utilizzando per inviare lo script.
Shiv4nsh

Hai fornito l'URL del master Spark?
Kshitij Kulshrestha

@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang

@KSHITIJKULSHRESTHA Sì.
Shuai Zhang

Mi sono imbattuto in questo negli unit-test del mio Sparkprogetto ( ). Dalla risposta di @Dazzler ho capito che devo spostare la creazione all'interno delle suite. Ma anche solo dichiarare s di essere risolve il problema (amore !). Questo è stato sottolineato da @gyuseong nella sua risposta di seguitoDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
y2k-shubham

Risposte:


40

Dove è definito l'oggetto sparkContext, è all'interno della funzione principale?

Anch'io ho affrontato lo stesso problema, l'errore che ho fatto è stato di avviare sparkContext all'esterno della funzione principale e all'interno della classe.

Quando l'ho avviato all'interno della funzione principale, ha funzionato bene.


11
Spark ha davvero bisogno di migliorare: mostra solo messaggi di errore molto confusi e poco informativi quando succede qualcosa di sbagliato
Shuai Zhang

3
Questa è una soluzione alternativa e non una soluzione, cosa succede se voglio creare un contesto Singletion e creare un livello separato di contesto oltre alla funzione principale per più applicazioni?
Murtaza Kanchwala

1
"Tieni presente che le applicazioni dovrebbero definire un main()metodo invece di estendere scala.App. Le sottoclassi di scala.Apppotrebbero non funzionare correttamente." Manuale Spark 2.1.0
ruhong

Prestare attenzione a dove si tenta di getOrCreate()creare un contesto a livello di driver e trasmetterlo a livello di esecutore se necessario.
reim

131

Il TLDR:

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

un elenco delle opzioni per spark.master in spark 2.2.1

Sono finito su questa pagina dopo aver provato a eseguire un semplice programma java Spark SQL in modalità locale. Per fare questo, ho scoperto che potevo impostare spark.master usando:

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

Un aggiornamento alla mia risposta:

Per essere chiari, questo non è ciò che dovresti fare in un ambiente di produzione. In un ambiente di produzione, spark.master dovrebbe essere specificato in un paio di altri posti: o in $ SPARK_HOME / conf / spark-defaults.conf (qui è dove lo metterà il gestore di cloudera), o sulla riga di comando quando lo invii l'applicazione. (ex spark-submit --master filato).

Se specifichi spark.master come "locale" in questo modo, spark proverà a funzionare in una singola jvm, come indicato dai commenti seguenti. Se poi si tenta di specificare --deploy-mode cluster, verrà visualizzato un errore "La modalità di distribuzione del cluster non è compatibile con il master" local "". Questo perché l'impostazione spark.master = local significa che NON stai eseguendo in modalità cluster.

Invece, per un'app di produzione, all'interno della tua funzione principale (o in funzioni chiamate dalla tua funzione principale), dovresti semplicemente usare:

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

Questo utilizzerà le configurazioni specificate sulla riga di comando / nei file di configurazione.

Inoltre, per essere chiari anche su questo: --master e "spark.master" sono esattamente lo stesso parametro, solo specificato in modi diversi. L'impostazione di spark.master nel codice, come nella mia risposta sopra, sovrascriverà i tentativi di impostare --master e sovrascriverà i valori in spark-defaults.conf, quindi non farlo in produzione. È ottimo per i test però.

inoltre, vedi questa risposta . che si collega a un elenco di opzioni per spark.master e ciò che ognuna fa effettivamente.

un elenco delle opzioni per spark.master in spark 2.2.1


5
sì, l'aggiunta di ".config (" spark.master "," local ")" ha funzionato anche per me.
Ashutosh S

Grazie, questo ha funzionato per me - ma qualcuno potrebbe spiegare a un principiante (me) cosa sta facendo .config ("spark.master", "local")? Il mio codice andrà ancora bene per essere compilato in un jar ed eseguito in produzione?
user1761806

4
@ user1761806 mentre molte delle risposte riportano questo come una soluzione, cambia radicalmente il modo in cui spark elabora, utilizzando solo una singola JVM. Locale viene utilizzato per i test locali e non è la soluzione corretta per risolvere questo problema se si intende eseguire la distribuzione in un cluster. Ho avuto problemi simili e la risposta accettata è stata la soluzione corretta al mio problema.
Nathaniel Wendt

58

Ha funzionato per me dopo la sostituzione

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

con

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

Ho trovato questa soluzione su qualche altro thread su stackoverflow.


1
Signore, mi hai salvato la giornata ... Grazie!
Hako

3
Questo risolve la domanda dell'OP? Questo crea un cluster locale in questa JVM, non si collega a uno standalone altrove.
Azeroth2b

Questo risolve il problema. Non so (ancora) le implicazioni di setMaster("local[2]")(sarebbe bello avere una spiegazione), ma questa risposta può essere considerata la soluzione al problema.
Rick

Ho appena modificato la risposta per includere queste informazioni :)
Rick

26

Il valore predefinito di "spark.master" è spark: // HOST: PORT e il codice seguente tenta di ottenere una sessione dal cluster autonomo in esecuzione su HOST: PORT e si aspetta che il valore HOST: PORT sia nel spark file di configurazione.

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

" org.apache.spark.SparkException: un URL master deve essere impostato nella configurazione " afferma che HOST: PORT non è impostato nel file di configurazione spark.

Per non preoccuparti del valore di "HOST: PORT", imposta spark.master come locale

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

Ecco il collegamento per l'elenco dei formati in cui l'URL principale può essere passato a spark.master

Riferimento: Tutorial Spark - Configurazione dell'ecosistema Spark


Grazie mille mi hai salvato la giornata!
GentleCoder

6

Se stai eseguendo un'applicazione standalone, devi usare SparkContextinvece diSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()

5
.setMaster("local")è la chiave per risolvere il problema per me
tom10271

Cosa succede se l'ho impostato ma ho ancora questo errore? @ tom10271
Anna Leonenko

@AnnaLeonenko Mi dispiace ma ho smesso di sviluppare l'applicazione Spark già da un anno, non riesco a ricordare la mia memoria. Ma immagino che il tuo nodo principale non sia locale gestito da spark ma filato?
tom10271

1
@AnnaLeonenko Ho controllato le mie impostazioni. Quando lo eseguivo localmente per lo sviluppo e utilizzo Spark solo per gestire il nodo master, lo imposterò su localo local[*]. Quando lo distribuisco su AWS EMR, utilizza Yarn per il coordinamento, quindi imposto master comeyarn
tom10271

6

basta aggiungere .setMaster("local")al codice come mostrato di seguito:

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

Ha funzionato per me! Buona programmazione!


3

In che modo il contesto Spark nella tua applicazione sceglie il valore per Spark Master?

  • O lo fornisci esplicitamente SparkConfdurante la creazione di SC.
  • Oppure sceglie da System.getProperties(dove SparkSubmit lo ha messo in precedenza dopo aver letto il tuo --masterargomento).

Ora, SparkSubmitviene eseguito sul driver, che nel tuo caso è la macchina da cui stai eseguendo lo spark-submitscript. E questo probabilmente sta funzionando come previsto anche per te.

Tuttavia, dalle informazioni che hai pubblicato sembra che tu stia creando un contesto spark nel codice che viene inviato all'esecutore - e dato che non c'è spark.master disponibili proprietà di sistema, fallisce. (E non dovresti farlo davvero, se questo è il caso.)

Puoi inserire il GroupEvolutionEScodice (in particolare dove stai creando SparkContext(s)).


1
Sì. Avrei dovuto creare SparkContext nelle mainfunzioni di GroupEvolutionES (cosa che non ho fatto).
Shuai Zhang

1
Questa è una soluzione alternativa e non una soluzione, cosa succede se voglio creare un contesto Singletion e creare un livello separato di contesto oltre alla funzione principale per più applicazioni? Qualche commento su come posso ottenerlo?
Murtaza Kanchwala

2

Sostituzione:

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");

Ha fatto la magia.


5
La tua soluzione non è esattamente la stessa di quella che ha pubblicato @Sachin?
Akavall

perché locale [2] puoi spiegare
SUDARSHAN


2

Ho avuto lo stesso problema, ecco il mio codice prima della modifica:

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)
  }

}

E dopo aver sostituito:

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

Con :

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

Ha funzionato bene!


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

Questa soluzione è stata ciò che ha funzionato per me. Grazie per averlo messo. @Mario.
Siwoku Adeola

2

prova questo

fare tratto

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

lo estende

object Preprocess extends SparkSessionWrapper {

1

Manca il setMaster ("local [*]") da impostare. Una volta aggiunto, il problema viene risolto.

Problema:

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

soluzione:

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

0

Se stai usando il seguente codice

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

Quindi sostituire con le seguenti righe

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

In Spark 2.0 puoi usare il seguente codice

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

Devi aggiungere .master ("local [*]") se eseguire local qui * significa tutto il nodo, puoi dire invece di 8 1,2 ecc.

È necessario impostare l'URL principale se sul cluster


0

Se non fornisci la configurazione Spark in JavaSparkContext, viene visualizzato questo errore. Ovvero: JavaSparkContext sc = new JavaSparkContext ();

Soluzione: fornire JavaSparkContext sc = new JavaSparkContext (conf);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.