web-dev-qa-db-fra.com

Spark - Erreur "Une URL principale doit être définie dans votre configuration" lors de la soumission d'une application

J'ai une application Spark qui s'exécute sans problème en mode local, mais qui rencontre des problèmes lors de la soumission au cluster Spark.

Les messages d'erreur sont les suivants:

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)

Dans le code ci-dessus, GroupEvolutionES est la classe principale. Le message d'erreur indique "Une URL principale doit être définie dans votre configuration", mais j'ai fourni le paramètre "--master" à spark-submit.

Quelqu'un qui sait comment résoudre ce problème?

Version Spark: 1.6.1

75
Shuai Zhang

Où l'objet sparkContext est-il défini, se trouve-t-il dans la fonction principale?

Moi aussi, j'ai rencontré le même problème. L'erreur que j'ai commise a été d'initier sparkContext en dehors de la fonction principale et à l'intérieur de la classe.

Lorsque je l'ai lancé dans la fonction principale, cela a bien fonctionné.

36
Dazzler

Le TLDR:

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

liste des options pour spark.master dans spark 2.2.1

Je me suis retrouvé sur cette page après avoir essayé de lancer un simple programme Spark SQL Java en mode local. Pour ce faire, j'ai trouvé que je pouvais définir spark.master en utilisant:

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

Une mise à jour de ma réponse:

Pour être clair, ce n'est pas ce que vous devriez faire dans un environnement de production. Dans un environnement de production, spark.master doit être spécifié à un ou deux autres endroits: soit dans $ SPARK_HOME/conf/spark-defaults.conf (c’est ici que cloudera manager le mettra), soit sur la ligne de commande lorsque vous soumettez l'application. (ex-fil d'étincelle - maître).

Si vous spécifiez spark.master comme étant "local" de cette manière, spark essaiera de s'exécuter dans un seul fichier jvm, comme indiqué dans les commentaires ci-dessous. Si vous essayez ensuite de spécifier le cluster --deploy-mode, vous obtiendrez une erreur "Le mode de déploiement du cluster n'est pas compatible avec le maître" local "". En effet, si vous définissez spark.master = local, cela signifie que vous n'exécutez PAS en mode cluster.

Au lieu de cela, pour une application de production, dans votre fonction principale (ou dans des fonctions appelées par votre fonction principale), vous devez simplement utiliser:

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

Ceci utilisera les configurations spécifiées dans les fichiers de configuration/in de la ligne de commande.

En outre, pour que ce soit aussi clair: --master et "spark.master" sont exactement les mêmes paramètres, mais ils sont spécifiés de différentes manières. Définir spark.master dans le code, comme dans ma réponse ci-dessus, annulera les tentatives de définition de --master et les valeurs dans spark-defaults.conf. Ne le faites pas en production. C'est bien pour les tests bien.

voir aussi cette réponse . qui renvoie à ne liste des options pour spark.master et à ce que chacune fait réellement.

liste des options pour spark.master dans spark 2.2.1

98
Jack Davidson

Travaillé pour moi après avoir remplacé

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");

avec

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Trouvé cette solution sur un autre thread sur stackoverflow.

52
Sachin

La valeur par défaut de "spark.master" est spark: // Host: PORT et le code suivant tente d'obtenir une session du cluster autonome exécuté à Host: PORT et attend que la valeur Host: PORT soit dans le fichier de configuration spark.

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

" org.Apache.spark.SparkException: une URL principale doit être définie dans votre configuration " indique que Hôte: PORT n'est pas défini dans le fichier de configuration spark.

Pour ne pas vous soucier de la valeur de "Host: PORT", définissez spark.master comme local

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

Here est le lien vers la liste des formats dans lesquels l'URL principale peut être transmise à spark.master.

Référence: Didacticiel Spark - Configuration Spark Écosystème

26
Mallikarjun M

Si vous exécutez une application autonome, vous devez utiliser SparkContext au lieu de SparkSession

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

Comment le contexte spark de votre application sélectionne-t-il la valeur du maître spark?

  • Vous pouvez soit le fournir explicitement avec SparkConf lors de la création de SC.
  • Ou il choisit dans le System.getProperties (où SparkSubmit l'a précédemment placé après avoir lu votre argument --master).

Maintenant, SparkSubmit s'exécute sur le pilote - qui dans votre cas est la machine à partir de laquelle vous exécutez le script spark-submit. Et cela fonctionne probablement comme prévu pour vous aussi.

Cependant, d'après les informations que vous avez publiées, il semble que vous créiez un contexte spark dans le code envoyé à l'exécuteur testamentaire - et étant donné qu'il n'y a pas de propriété système spark.master disponible ici. , il échoue. (Et vous ne devriez pas vraiment le faire, si c'est le cas.)

Pouvez-vous s'il vous plaît poster le code GroupEvolutionES (en particulier l'endroit où vous créez SparkContext(s)).

3
Sachin Tyagi

J'ai eu le même problème, voici mon code avant modification:

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

}

Et après avoir remplacé:

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

Avec :

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

Cela a bien fonctionné!

2
user2989087
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")
2
rio

Remplacement:

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

A fait la magie.

2
Nazima

essaye ça

faire un trait

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

le prolonge

object Preprocess extends SparkSessionWrapper {
2
gyuseong

Il nous manque le setMaster ("local [*]") pour définir. Une fois que nous avons ajouté, le problème est résolu.

Problème:

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

solution:

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

Si vous utilisez le code suivant

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

Puis remplacez par les lignes suivantes

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

Dans Spark 2.0, vous pouvez utiliser le code suivant

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

Vous devez ajouter .master ("local [*]") si exécuter local ici * signifie que tous les nœuds, vous pouvez dire à la place de 8 1,2 etc.

Vous devez définir l'URL principale si vous êtes sur le cluster.

0
vaquar khan

ajoutez simplement .setMaster("local") à votre code comme indiqué ci-dessous:

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

Cela a fonctionné pour moi! Bonne codage!

0
kumar sanu

Si vous ne fournissez pas la configuration Spark dans JavaSparkContext, vous obtenez alors cette erreur. C’est-à-dire: JavaSparkContext sc = new JavaSparkContext ();

Solution: indiquez JavaSparkContext sc = new JavaSparkContext (conf);

0
Rimi Gandhi