Spark: error "Se debe establecer una URL maestra en su configuración" al enviar una aplicación

93

Tengo una aplicación Spark que se ejecuta sin problemas en modo local, pero tengo algunos problemas al enviarme al clúster Spark.

Los mensajes de error son los siguientes:

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)

En el código anterior, GroupEvolutionESes la clase principal. El mensaje de error dice "Se debe establecer una URL maestra en su configuración", pero he proporcionado el parámetro "--master" a spark-submit.

¿Alguien que sepa cómo solucionar este problema?

Versión Spark: 1.6.1

Shuai Zhang
fuente
1
¿Podría pegar aquí el comando que está utilizando para enviar el script?
Shiv4nsh
¿Ha proporcionado la URL principal de Spark?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULSHRESTHA Sí.
Shuai Zhang
Me encontré con esto en Sparklas pruebas unitarias de mi proyecto ( DataFrameSuiteBase). De la respuesta de @Dazzler , entendí que debo mover la DataFramecreación dentro de las test(..) { .. }suites. Pero también simplemente declarar que DataFrames lolazy soluciona ( Scala¡ amor !). Esto se ha señalado en @gyuseong en su respuesta a continuación.
y2k-shubham

Respuestas:

40

¿Dónde está definido el objeto sparkContext, está dentro de la función principal?

Yo también enfrenté el mismo problema, el error que cometí fue que inicié el sparkContext fuera de la función principal y dentro de la clase.

Cuando lo inicié dentro de la función principal, funcionó bien.

Deslumbrante
fuente
11
Spark realmente necesita mejorar: solo muestra mensajes de error muy confusos y poco informativos cuando sucede algo malo
Shuai Zhang
3
Esta es una solución alternativa y no una solución. ¿Qué sucede si quiero crear un contexto de unificación y crear una capa separada de contexto además de la función principal para múltiples aplicaciones?
Murtaza Kanchwala
1
"Tenga en cuenta que las aplicaciones deben definir un main()método en lugar de ampliar scala.App. Es posible que las subclases de scala.Appno funcionen correctamente". Spark 2.1.0 Manual
ruhong
Preste atención a dónde intenta getOrCreate()crear un contexto a nivel de controlador y pasar al nivel de ejecutor según sea necesario.
reim
131

El TLDR:

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

una lista de las opciones para spark.master en spark 2.2.1

Terminé en esta página después de intentar ejecutar un programa simple de Spark SQL Java en modo local. Para hacer esto, descubrí que podía configurar spark.master usando:

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

Una actualización de mi respuesta:

Para ser claros, esto no es lo que debe hacer en un entorno de producción. En un entorno de producción, spark.master debe especificarse en uno de los otros dos lugares: ya sea en $ SPARK_HOME / conf / spark-defaults.conf (aquí es donde el administrador de cloudera lo pondrá), o en la línea de comandos cuando envíe la aplicación. (ex spark-submit - hilo maestro).

Si especifica spark.master para que sea 'local' de esta manera, spark intentará ejecutarse en un solo jvm, como se indica en los comentarios a continuación. Si luego intenta especificar --deploy-mode cluster, obtendrá un error 'El modo de implementación de clúster no es compatible con master "local"'. Esto se debe a que establecer spark.master = local significa que NO está ejecutando en modo de clúster.

En cambio, para una aplicación de producción, dentro de su función principal (o en funciones llamadas por su función principal), simplemente debe usar:

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

Esto usará las configuraciones especificadas en la línea de comando / en los archivos de configuración.

Además, para ser claros en esto también: --master y "spark.master" son exactamente el mismo parámetro, solo que se especifican de diferentes maneras. Establecer spark.master en el código, como en mi respuesta anterior, anulará los intentos de establecer --master, y anulará los valores en spark-defaults.conf, así que no lo haga en producción. Sin embargo, es genial para las pruebas.

también, vea esta respuesta . que enlaza con una lista de opciones para spark.master y lo que hace cada una.

una lista de las opciones para spark.master en spark 2.2.1

Jack Davidson
fuente
5
sí, agregar ".config (" spark.master "," local ")" también funcionó para mí.
Ashutosh S
Gracias, esto funcionó para mí, pero ¿alguien podría explicarle a un novato (yo) qué está haciendo el .config ("spark.master", "local")? ¿Mi código seguirá estando bien para compilarse en un jar y ejecutarse en producción?
user1761806
4
@ user1761806 si bien muchas de las respuestas informan de esto como una solución, cambia fundamentalmente la forma en que los procesos de chispa, solo usando una sola JVM. Local se usa para pruebas locales y no es la solución correcta para solucionar este problema si tiene la intención de implementar en un clúster. Tuve problemas similares y la respuesta aceptada fue la solución correcta a mi problema.
Nathaniel Wendt
58

Trabajó para mí después de reemplazar

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

Encontré esta solución en algún otro hilo en stackoverflow.

Sachin
fuente
1
Usted señor, me salvó el día ... ¡Gracias!
Hako
3
¿Resuelve esto la pregunta del OP? Esto crea un clúster local en esta JVM, no se conecta a una independiente en otro lugar.
Azeroth2b
Esto resuelve el problema. No sé (todavía) acerca de las implicaciones de setMaster("local[2]")(sería bueno tener una explicación), pero esta respuesta puede considerarse la solución para el problema.
Rick
Acabo de editar la respuesta para incluir esta información :)
Rick
26

El valor predeterminado de "spark.master" es spark: // HOST: PORT, y el siguiente código intenta obtener una sesión del clúster independiente que se ejecuta en HOST: PORT y espera que el valor HOST: PORT esté en el archivo de configuración de Spark.

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

" org.apache.spark.SparkException: se debe establecer una URL maestra en su configuración " indica que HOST: PORT no está establecido en el archivo de configuración de Spark.

Para no preocuparse por el valor de "HOST: PORT", establezca spark.master como local

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

aquí está el enlace para la lista de formatos en los que se puede pasar la URL maestra a spark.master

Referencia: Tutorial de Spark - Configurar el ecosistema de Spark

Mallikarjun M
fuente
¡Muchas gracias por salvarme el día!
GentleCoder
6

Si está ejecutando una aplicación independiente, debe usar en SparkContextlugar deSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
fuente
5
.setMaster("local")es la clave para resolver el problema para mí
tom10271
¿Qué pasa si lo tengo configurado pero todavía tengo este error? @ tom10271
Anna Leonenko
@AnnaLeonenko Lo siento, pero ya hace un año que dejé de desarrollar la aplicación Spark, no puedo recordar mi memoria. Pero supongo que su nodo maestro no es local, que es administrado por chispa, sino por hilo.
tom10271
1
@AnnaLeonenko He comprobado mi configuración. Cuando lo estaba ejecutando localmente para el desarrollo y solo uso Spark para administrar el nodo maestro, lo estableceré en localo local[*]. Cuando lo implemento en AWS EMR, usa Yarn para la coordinación, luego configuro el maestro comoyarn
tom10271
6

simplemente agregue .setMaster("local")a su código como se muestra a continuación:

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

¡Funcionó para mí! ¡Feliz codificación!

kumar sanu
fuente
3

¿Cómo el contexto de Spark en su aplicación elige el valor para Spark Master?

  • O lo proporciona explícitamente dentro de SparkConf mientras crea SC.
  • O elige de System.getProperties(donde SparkSubmit lo puso antes después de leer su --masterargumento).

Ahora, se SparkSubmitejecuta en el controlador, que en su caso es la máquina desde donde está ejecutando elspark-submit script. Y probablemente esto también esté funcionando como se esperaba para usted.

Sin embargo, a partir de la información que ha publicado, parece que está creando un contexto de chispa en el código que se envía al ejecutor, y dado que no hay spark.master propiedad del sistema disponible allí, falla. (Y realmente no debería hacerlo, si este es el caso).

¿Puede publicar el GroupEvolutionEScódigo (específicamente donde está creando SparkContext(s)).

Sachin Tyagi
fuente
1
Si. Debería haber creado SparkContext en las mainfunciones de GroupEvolutionES (que no hice).
Shuai Zhang
1
Esta es una solución alternativa y no una solución. ¿Qué sucede si quiero crear un contexto de unificación y crear una capa separada de contexto además de la función principal para múltiples aplicaciones? ¿Algún comentario sobre cómo puedo lograrlo?
Murtaza Kanchwala
2

Reemplazo:

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

Hizo la magia.

Nazima
fuente
5
¿No es su solución exactamente la misma que la que publicó @Sachin?
Akavall
¿Por qué local [2] puede explicar
SUDARSHAN
sobre local [2] -> stackoverflow.com/questions/32356143/…
raevilman
2

Tuve el mismo problema, aquí está mi código antes de la modificación:

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

}

Y después de reemplazar:

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

Con :

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

¡Funcionó bien!


fuente
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
fuente
Esta solución fue lo que funcionó para mí. Gracias por ponerlo. @Mario.
Siwoku Adeola
2

prueba esto

hacer rasgo

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

lo extiende

object Preprocess extends SparkSessionWrapper {
Gyuseong
fuente
1

Nos falta el setMaster ("local [*]") para configurar. Una vez que agregamos, el problema se resuelve.

Problema:

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

solución:

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

Si está utilizando el siguiente código

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

Luego reemplace con las siguientes líneas

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

En Spark 2.0 puede usar el siguiente código

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

Debe agregar .master ("local [*]") si ejecutar local aquí * significa todos los nodos, puede decir en lugar de 8 1,2, etc.

Debe configurar la URL maestra si está en el clúster

vaquar khan
fuente
0

Si no proporciona la configuración de Spark en JavaSparkContext, obtendrá este error. Es decir: JavaSparkContext sc = new JavaSparkContext ();

Solución: proporcione JavaSparkContext sc = new JavaSparkContext (conf);

Rimi Gandhi
fuente