2016-06-24 16 views
46

Possiedo un'app Spark che funziona senza problemi in modalità locale, ma presenta alcuni problemi durante l'invio al cluster Spark.Spark - Errore "Un master URL deve essere impostato nella configurazione" quando si invia un'applicazione

msg 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 precedente, GroupEvolutionES è la classe principale. L'errore msg dice "Un master URL deve essere impostato nella tua configurazione", ma ho fornito il parametro "--master" a spark-submit.

Chi sa come risolvere questo problema?

versione Spark: 1.6.1

+0

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

+0

Hai fornito l'URL master spark? –

+0

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

risposta

23

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

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

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

+0

Spark ha davvero bisogno di migliorare: mostra solo messaggi di errore molto confusi e disinformati quando qualcosa di sbagliato accade –

+2

Questa è una soluzione alternativa e non una soluzione, Cosa succede se voglio creare un Contesto Singletion e creare un livello separato di Contesto a parte la funzione principale per più applicazioni? –

+1

"Nota che le applicazioni dovrebbero definire un metodo' main() 'invece di estendere' scala.App'. Le sottoclassi di 'scala.App' potrebbero non funzionare correttamente." [Spark 2.1.0 Manual] (http://spark.apache.org/docs/latest/quick-start.html#self-contained-applications) – ruhong

3

In che modo il contesto spark nella propria applicazione seleziona il valore per spark master?

  • È possibile fornire esplicitamente SparkConf durante la creazione di SC.
  • Oppure seleziona dallo System.getProperties (dove SparkSubmit lo ha inserito in precedenza dopo aver letto l'argomento --master).

Ora, SparkSubmit viene eseguito sul conducente - che nel tuo caso è la macchina da cui si sta eseguendo lo script spark-submit. E probabilmente sta funzionando come previsto anche per te.

Tuttavia, dalle informazioni che hai postato sembra che tu stia creando un contesto di scintilla nel codice che viene inviato all'esecutore - e dato che non c'è nessuna proprietà di sistema spark.master disponibile lì, fallisce. (E non dovresti farlo davvero, se è così.)

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

+1

Sì. Avrei dovuto creare SparkContext nelle funzioni 'main' di GroupEvolutionES (che non ho). –

+1

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

45

Ho finito su questa pagina dopo aver tentato di eseguire un semplice programma Java Spark SQL in modalità locale. Per fare questo, ho scoperto che ho potuto impostare spark.master utilizzando:

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

Un aggiornamento per la mia risposta:

Per essere chiari, questo non è ciò che si dovrebbe fare in un ambiente di produzione. In un ambiente di produzione, spark.master deve essere specificato in uno degli altri due punti: in $ SPARK_HOME/conf/spark-defaults.conf (questo è dove il gestore cloudera lo metterà), o sulla riga di comando quando si invia l'applicazione. (ex scintilla-invia - filato maestro).

Se si specifica che spark.master è "locale" in questo modo, spark tenterà di eseguire in un singolo jvm, come indicato dai commenti seguenti. Se si tenta quindi di specificare il cluster in modalità -deploy, verrà visualizzato un errore "La modalità di distribuzione del cluster non è compatibile con il master" locale "". Questo è dovuto all'impostazione della scintilla.master = locale significa che NON stai correndo in modalità cluster.

Invece, per un'applicazione di produzione, all'interno della vostra funzione principale (o in funzioni chiamate dalla funzione principale), è necessario utilizzare semplicemente:

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

Questo userà le configurazioni specificati sulla riga di comando/a file di configurazione.

Inoltre, per essere chiari su questo anche: --master e "spark.master" sono esattamente lo stesso parametro, solo specificato in diversi modi. 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 nella produzione. È fantastico per i test però.

, vedere this answer. che collega a a list of the options for spark.master e ciò che ciascuno fa effettivamente.

a list of the options for spark.master in spark 2.2.1

+2

sì, aggiungendo ".config (" spark.master "," local ")" ha funzionato anche per me. – ashu17188

+0

Grazie per aver funzionato, ma qualcuno potrebbe spiegare a un principiante (io) che cosa sta facendo il .config ("spark.master", "local")? Il mio codice andrà bene per essere compilato in un barattolo e avviato alla produzione? – user1761806

+2

@ user1761806 mentre molte delle risposte segnalano questo come una correzione, in sostanza cambia il modo in cui i processi spark, utilizzando solo una singola JVM. Locale è 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. –

46

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

trovato questa soluzione su qualche altro thread StackOverflow.

+1

Signore, ho salvato la mia giornata ... Grazie! – Hako

+1

Questo risolve la domanda dell'OP? Questo crea un cluster locale in questa JVM, non si collega a una versione autonoma altrove. – Azeroth2b

+0

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

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

Forse la magia.

+5

La tua soluzione non è esattamente uguale a ciò che @Sachin ha pubblicato? – Akavall

+0

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 la sostituzione:

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

Con:

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

Ha funzionato bene!

14

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 l'HOST: Valore PORT da inserire nel file di configurazione spark.

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

"org.apache.spark.SparkException: Un URL master deve essere impostato nella configurazione" afferma che host: porta non è impostato nel file di configurazione scintilla.

Per non preoccuparsi di valore di "host: porta", impostare spark.master come locale

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

Here è il link per la lista dei formati in cui URL master può essere passato a scintilla .padroneggiare

+0

Grazie mille per aver salvato la mia giornata! – GentleCoder

0

Se si utilizza codice seguente

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

quindi sostituire con i seguenti linee

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

In Spark 2.0 è possibile utilizzare seguente codice

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

È necessario per aggiungere .master ("local [*]") if runing locale qui * significa tutti i nodi, si può dire invece di 8 1,2 ecc

È necessario impostare Maestro URL se il gruppo

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

Questa soluzione era ciò che ha funzionato per me. Grazie per averlo messo. @Mario. –

0

Ci mancano il setMaster ("locale [*] ") 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() 
-1

Se non si forniscono di configurazione Spark in JavaSparkContext quindi si ottiene questo errore. Ossia: JavaSparkContext sc = new JavaSparkContext();

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

Problemi correlati