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

93

J'ai une application Spark qui fonctionne sans problème en mode local, mais j'ai quelques 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, GroupEvolutionESest la classe principale. Le msg 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

Shuai Zhang
la source
1
Pourriez-vous s'il vous plaît coller ici la commande que vous utilisez pour soumettre le script.
Shiv4nsh
Avez-vous fourni l'URL du maître Spark?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULSHRESTHA Oui.
Shuai Zhang
J'ai rencontré cela dans Sparkles tests unitaires de mon projet ( DataFrameSuiteBase). D' après la réponse de @Dazzler , j'ai compris que je devais déplacer la DataFramecréation à l'intérieur des test(..) { .. }suites. Mais aussi simplement déclarer DataFrames êtrelazy corrige (amour Scala!). Cela a été souligné par @gyuseong dans sa réponse ci
y2k-shubham

Réponses:

40

Où est défini l'objet sparkContext, est-il à l'intérieur de la fonction principale?

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

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

Dazzler
la source
11
Spark doit vraiment s'améliorer: il affiche juste des messages d'erreur très déroutants et peu informatifs quand quelque chose ne va pas
Shuai Zhang
3
Il s'agit d'une solution de contournement et non d'une solution. Que faire si je souhaite créer un contexte Singletion et créer une couche de contexte distincte en dehors de la fonction principale pour plusieurs applications?
Murtaza Kanchwala
1
"Notez que les applications doivent définir une main()méthode au lieu d'étendre scala.App. Les sous-classes de scala.Apppeuvent ne pas fonctionner correctement." Manuel Spark 2.1.0
ruhong
Faites attention à l'endroit où vous essayez, getOrCreate()un contexte doit être créé au niveau du pilote et transmis au niveau de l'exécuteur si nécessaire.
reim le
131

Le TLDR:

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

une liste des options pour spark.master dans spark 2.2.1

Je me suis retrouvé sur cette page après avoir essayé d'exécuter un simple programme java Spark SQL 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 devez faire dans un environnement de production. Dans un environnement de production, spark.master doit être spécifié à l'un des deux autres endroits: soit dans $ SPARK_HOME / conf / spark-defaults.conf (c'est là que cloudera manager le placera), soit sur la ligne de commande lorsque vous soumettez l'application. (ex spark-submit - master yarn).

Si vous spécifiez spark.master comme étant «local» de cette manière, spark essaiera de s'exécuter dans un seul jvm, comme indiqué par 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 »». Cela est dû au fait que la définition de spark.master = local signifie que vous n'utilisez PAS en mode cluster.

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

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

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

Aussi, pour être clair sur ceci aussi: --master et "spark.master" sont exactement le même paramètre, juste spécifié de différentes manières. La définition de spark.master dans le code, comme dans ma réponse ci-dessus, remplacera les tentatives de définition de --master et remplacera les valeurs dans spark-defaults.conf, alors ne le faites pas en production. C'est parfait pour les tests.

aussi, voyez cette réponse . qui renvoie à une liste d'options pour spark.master et ce que chacune fait réellement.

une liste des options pour spark.master dans spark 2.2.1

Jack Davidson
la source
5
oui, l'ajout de ".config (" spark.master "," local ")" a fonctionné pour moi aussi.
Ashutosh S
Merci, cela a fonctionné pour moi - mais quelqu'un pourrait-il expliquer à un débutant (moi) ce que fait le .config ("spark.master", "local")? Mon code pourra-t-il toujours être compilé dans un fichier jar et exécuté en production?
user1761806
4
@ user1761806 alors que de nombreuses réponses rapportent cela comme un correctif, cela change fondamentalement la façon dont Spark traite, en n'utilisant qu'une seule JVM. Local est utilisé pour les tests locaux et n'est pas la solution appropriée pour résoudre ce problème si vous avez l'intention de déployer sur un cluster. J'ai eu des problèmes similaires et la réponse acceptée était la bonne solution à mon problème.
Nathaniel Wendt
58

A travaillé pour moi après le remplacement

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

J'ai trouvé cette solution sur un autre thread sur stackoverflow.

Sachin
la source
1
Vous Monsieur, m'a sauvé la journée ... Merci!
Hako
3
Cela résout-il la question du PO? Cela crée un cluster local dans cette machine virtuelle Java, et non une connexion à une autre machine autonome.
Azeroth2b
Cela résout le problème. Je ne sais pas (encore) sur les implications de setMaster("local[2]")(ce serait bien d'avoir une explication), mais cette réponse peut être considérée comme la solution au problème.
Rick
Je viens de modifier la réponse pour inclure cette information :)
Rick
26

La valeur par défaut de "spark.master" est spark: // HOST: PORT, et le code suivant essaie d'obtenir une session du cluster autonome qui s'exécute sur HOST: PORT et s'attend à ce 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 HOST: 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();

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

Référence: Tutoriel Spark - Configurer l'écosystème Spark

Mallikarjun M
la source
Merci beaucoup vous avez sauvé ma journée!
GentleCoder
6

Si vous exécutez une application autonome, vous devez utiliser à la SparkContextplace deSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
la source
5
.setMaster("local")est la clé pour résoudre le problème pour moi
tom10271
Que faire si je l'ai défini mais que j'ai toujours cette erreur? @ tom10271
Anna Leonenko
@AnnaLeonenko Je suis désolé mais j'ai arrêté de développer l'application Spark depuis un an déjà, je ne me souviens plus de ma mémoire. Mais je suppose que votre nœud maître n'est pas local, ce qui est géré par une étincelle mais par du fil?
tom10271
1
@AnnaLeonenko J'ai vérifié mes paramètres. Lorsque je l'exécutais localement pour le développement et que je n'utilisais Spark que pour gérer le nœud maître, je le définirai sur localou local[*]. Lorsque je le déploie sur AWS EMR, il utilise Yarn pour la coordination, puis je définis master commeyarn
tom10271
6

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

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

Cela a fonctionné pour moi! Bon codage!

kumar sanu
la source
3

Comment le contexte Spark dans votre application choisit-il la valeur de Spark Master?

  • Soit vous le fournissez explicitement SparkConflors de la création de SC.
  • Ou il choisit dans le System.getProperties(où SparkSubmit l'a mis plus tôt après avoir lu votre --masterargument).

Maintenant, SparkSubmits'exécute sur le pilote - qui dans votre cas est la machine à partir de laquelle vous exécutez le spark-submitscript. 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éez un contexte d'étincelle dans le code qui est envoyé à l'exécuteur - et étant donné qu'aucune spark.masterpropriété système n'y est disponible, cela échoue. (Et vous ne devriez pas vraiment le faire, si tel est le cas.)

Pouvez-vous s'il vous plaît poster le GroupEvolutionEScode (spécifiquement là où vous créez SparkContext(s)).

Sachin Tyagi
la source
1
Oui. J'aurais dû créer le SparkContext dans les mainfonctions de GroupEvolutionES (ce que je n'ai pas fait).
Shuai Zhang
1
Il s'agit d'une solution de contournement et non d'une solution. Que faire si je souhaite créer un contexte Singletion et créer une couche de contexte distincte en dehors de la fonction principale pour plusieurs applications? Des commentaires sur la façon dont je peux y parvenir?
Murtaza Kanchwala
2

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.

Nazima
la source
5
Votre solution n'est-elle pas exactement la même que ce que @Sachin a publié?
Akavall
pourquoi local [2] pouvez-vous expliquer
SUDARSHAN
about local [2] -> stackoverflow.com/questions/32356143/…
raevilman
2

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 le remplacement:

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

Avec :

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

Cela a bien fonctionné!


la source
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
la source
Cette solution a fonctionné pour moi. Merci de l'avoir mis en place. @Mario.
Siwoku Adeola
2

essaye ça

faire un trait

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

l'étend

object Preprocess extends SparkSessionWrapper {
gyuseong
la source
1

Il nous manque le setMaster ("local [*]") à 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()
KARTHIKEYAN.A
la source
0

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 tous les nœuds, vous pouvez dire insted de 8 1,2 etc

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

vaquar khan
la source
0

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

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

Rimi Gandhi
la source