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, 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" a spark-submit
.
¿Alguien que sepa cómo solucionar este problema?
Versión Spark: 1.6.1
scala
apache-spark
Shuai Zhang
fuente
fuente
Spark
las pruebas unitarias de mi proyecto (DataFrameSuiteBase
). De la respuesta de @Dazzler , entendí que debo mover laDataFrame
creación dentro de lastest(..) { .. }
suites. Pero también simplemente declarar queDataFrame
s lolazy
soluciona (Scala
¡ amor !). Esto se ha señalado en @gyuseong en su respuesta a continuación.Respuestas:
¿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.
fuente
main()
método en lugar de ampliarscala.App
. Es posible que las subclases descala.App
no funcionen correctamente". Spark 2.1.0 ManualgetOrCreate()
crear un contexto a nivel de controlador y pasar al nivel de ejecutor según sea necesario.El TLDR:
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:
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:
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
fuente
Trabajó para mí después de reemplazar
con
Encontré esta solución en algún otro hilo en stackoverflow.
fuente
setMaster("local[2]")
(sería bueno tener una explicación), pero esta respuesta puede considerarse la solución para el problema.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.
" 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
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
fuente
Si está ejecutando una aplicación independiente, debe usar en
SparkContext
lugar deSparkSession
fuente
.setMaster("local")
es la clave para resolver el problema para mílocal
olocal[*]
. Cuando lo implemento en AWS EMR, usa Yarn para la coordinación, luego configuro el maestro comoyarn
simplemente agregue
.setMaster("local")
a su código como se muestra a continuación:¡Funcionó para mí! ¡Feliz codificación!
fuente
¿Cómo el contexto de Spark en su aplicación elige el valor para Spark Master?
SparkConf
mientras crea SC.System.getProperties
(donde SparkSubmit lo puso antes después de leer su--master
argumento).Ahora, se
SparkSubmit
ejecuta 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
GroupEvolutionES
código (específicamente donde está creandoSparkContext(s)
).fuente
main
funciones de GroupEvolutionES (que no hice).Reemplazo:
Hizo la magia.
fuente
Tuve el mismo problema, aquí está mi código antes de la modificación:
Y después de reemplazar:
Con :
¡Funcionó bien!
fuente
fuente
prueba esto
hacer rasgo
lo extiende
fuente
Nos falta el setMaster ("local [*]") para configurar. Una vez que agregamos, el problema se resuelve.
Problema:
solución:
fuente
Si está utilizando el siguiente código
Luego reemplace con las siguientes líneas
En Spark 2.0 puede usar el siguiente código
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
fuente
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);
fuente