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