Spark-ошибка "основной URL должен быть установлен в вашей конфигурации" при отправке приложения
у меня есть приложение Spark,которое работает без проблем в локальном режиме, но есть некоторые проблемы при отправке в кластер Spark.
ошибка msg выглядит следующим образом:
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.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob.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.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob.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)
В приведенном выше коде GroupEvolutionES - это основной класс. Ошибка msg говорит: "главный URL должен быть установлен в вашей конфигурации", но я предоставил параметр "--master " для spark-submit.
кто знает, как решить эту проблему?
Искра версия: 1.6.1
13 ответов:
где определен объект sparkContext, находится ли он внутри основной функции?
Я тоже столкнулся с той же проблемой, ошибка, которую я сделал, была инициирована sparkContext вне основной функции и внутри класса.
когда я инициировал его внутри основной функции, он работал нормально.
я оказался на этой странице после попытки запустить простую программу Spark SQL java в локальном режиме. Для этого я обнаружил, что могу установить искру.мастер с помощью:
SparkSession spark = SparkSession .builder() .appName("Java Spark SQL basic example") .config("spark.master", "local") .getOrCreate();обновление к моему ответу:
чтобы было понятно, это не то, что вы должны делать в производственной среде. В производственной среде, Искра.мастер должен быть указан в одном из нескольких других мест: либо в $SPARK_HOME/conf/spark-defaults.conf (это где менеджер cloudera положит его), или на командная строка при отправке приложения. (бывший СПАРК-представить-мастер пряжа).
Если вы укажете искру.мастер, чтобы быть "локальным" таким образом, spark попытается запустить в одной jvm, как указано в комментариях ниже. Если вы затем попытаетесь указать -- deploy-mode cluster, вы получите сообщение об ошибке 'Cluster deploy mode не совместим с master "local"'. Это потому, что установка зажигания.master=local означает, что вы не работаете в режиме кластера.
вместо этого, для производственного приложения, в пределах ваша основная функция (или в функциях, вызываемых вашей основной функцией), вы должны просто использовать:
SparkSession .builder() .appName("Java Spark SQL basic example") .getOrCreate();это будет использовать конфигурации, указанные в командной строке / в файлах конфигурации.
кроме того, чтобы быть ясным в этом тоже: --Мастер и "Искра.master " - это точно такой же параметр, только указанный по-разному. Установка зажигания.мастер в коде, как и в моем ответе выше, переопределит попытки установить --master и переопределит значения в spark-defaults.конф, так что не делай этого в производстве. Его отлично подходит для тестов, хотя.
Также см. ответ. какие ссылки список опций для spark.мастер и что каждый из них на самом деле.
работал на меня после замены
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");С
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");нашел это решение в каком-то другом потоке на stackoverflow.
значение по умолчанию "spark.master " - это spark: / / HOST: PORT, и следующий код пытается получить сеанс из автономного кластера, который работает в ХОСТ:ПОРТ, и ожидает, что значение HOST: PORT будет в файле конфигурации spark.
SparkSession spark = SparkSession .builder() .appName("SomeAppName") .getOrCreate();"орг.апаш.искра.SparkException: главный URL должен быть установлен в вашей конфигурации" указано, что ХОСТ:ПОРТ не задано в файле конфигурации spark.
чтобы не заморачиваться значение "HOST: PORT", set Искра.мастер как local
SparkSession spark = SparkSession .builder() .appName("SomeAppName") .config("spark.master", "local") .getOrCreate();здесь - это ссылка на список форматов, в которых основной URL может быть передан в spark.мастер
ссылки : Spark Tutorial -Настройка Spark Экосистемы
как контекст spark в вашем приложении выбирает значение для Spark master?
- вы либо предоставляете его явно в пределах
SparkConfпри создании SC.- или он выбирает из
System.getProperties(где SparkSubmit ранее поставил его после прочтения вашего
замена :
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");сделал волшебство.
у меня была такая же проблема, вот мой код до изменения :
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) } }и после замены :
val conf = new SparkConf().setAppName("wordCount")С :
val conf = new SparkConf().setAppName("wordCount").setMaster("local[*]")Он работал нормально !
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")
попробуй такое
сделать черта
import org.apache.spark.sql.SparkSession trait SparkSessionWrapper { lazy val spark:SparkSession = { SparkSession .builder() .getOrCreate() } }расширяет его
object Preprocess extends SparkSessionWrapper {
Если вы используете следующий код
val sc = new SparkContext(master, "WordCount", System.getenv("SPARK_HOME"))затем заменить на следующие строки
val jobName = "WordCount"; val conf = new SparkConf().setAppName(jobName); val sc = new SparkContext(conf)
в Spark 2.0 вы можете использовать следующий код
val spark = SparkSession .builder() .appName("Spark SQL basic example") .config("spark.some.config.option", "some-value") .master("local[*]")// need to add .getOrCreate()нужно добавить .мастер("локальной [*]"), если подножка здесь местные * означает, что все вершины , вы можете сказать вместо 8 1,2 и т. д.
вам нужно установить главный URL, если на кластере
нам не хватает setMaster ("local [*]") установить. После того, как мы добавили, то проблема будет решена.
:
val spark = SparkSession .builder() .appName("Spark Hive Example") .config("spark.sql.warehouse.dir", warehouseLocation) .enableHiveSupport() .getOrCreate()устранение:
val spark = SparkSession .builder() .appName("Spark Hive Example") .config("spark.sql.warehouse.dir", warehouseLocation) .enableHiveSupport() .master("local[*]") .getOrCreate()
Если вы используете отдельное приложение, то вы должны использовать
SparkContextвместоSparkSessionval conf = new SparkConf().setAppName("Samples").setMaster("local") val sc = new SparkContext(conf) val textData = sc.textFile("sample.txt").cache()
Если вы не предоставляете конфигурацию Spark в JavaSparkContext, то вы получаете эту ошибку. То есть: JavaSparkContext sc = новый JavaSparkContext ();
решение: предоставить JavaSparkContext sc = new JavaSparkContext (conf);
Comments