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
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é.
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.
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.
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
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()
Comment le contexte spark de votre application sélectionne-t-il la valeur du maître spark?
SparkConf
lors de la création de SC.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)
).
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é!
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")
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.
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 {
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()
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.
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!
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);