tutorial spark learn for data coursera course big scala apache-spark

scala - learn - spark course



Spark: error "Se debe establecer una URL maestra en su configuraciĆ³n" al enviar una aplicaciĆ³n (14)

Tengo una aplicación Spark que se ejecuta sin problemas en modo local, pero tengo algunos problemas al enviar 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, GroupEvolutionES es 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" para spark-submit .

¿Alguien que sepa cómo solucionar este problema?

Versión Spark: 1.6.1


¿Cómo selecciona el contexto de chispa en su aplicación el valor de spark master?

  • Puede proporcionarlo explícitamente con SparkConf mientras crea SC.
  • O elige de System.getProperties (donde SparkSubmit lo colocó anteriormente después de leer su argumento --master ).

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

Sin embargo, según 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 ninguna propiedad del sistema spark.master disponible allí, falla. (Y realmente no deberías hacerlo, si este es el caso).

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


¿Dónde se define 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.


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 Java Spark SQL simple 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 lo colocará el administrador de cloudera), o en la línea de comando cuando envíe la aplicación. (ex envío de chispa - hilo maestro).

Si especifica que spark.master 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 el clúster --deploy-mode, obtendrá un error ''El modo de implementación del clúster no es compatible con el maestro "local". Esto se debe a que configurar spark.master = local significa que NO se 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 comandos / 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 especificado 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 hagas en producción. Sin embargo, es genial para las pruebas.

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

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


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 chispa.

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á configurado en el archivo de configuración de spark.

Para no preocuparse por el valor de "HOST: PORT", configure 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


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


Si está ejecutando una aplicación independiente, debe usar SparkContext lugar de SparkSession

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


Si está usando el siguiente código

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

Luego reemplace con las siguientes líneas

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

En Spark 2.0 puedes usar el siguiente código

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

Debe agregar .master ("local [*]") si la ejecución 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


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


Sustitución:

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.


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 .


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!


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 {


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

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

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


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