Подтвердить что ты не робот

Искра - ошибка "Главный 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$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)

В приведенном выше коде GroupEvolutionES - основной класс. Ошибка msg говорит: "Главный URL должен быть установлен в вашей конфигурации", но я предоставил параметр "--master" spark-submit.

Кто знает, как решить эту проблему?

Искра версия: 1.6.1

4b9b3361

Ответ 1

Где задан объект sparkContext, находится ли он внутри основной функции?

Я тоже столкнулся с одной и той же проблемой, ошибка, которую я совершил, - я инициировал sparkContext вне основной функции и внутри класса.

Когда я инициировал его внутри основной функции, он работал нормально.

Ответ 2

Работал для меня после замены

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.

Ответ 3

Я оказался на этой странице после попытки запустить простую Java-программу Spark SQL в локальном режиме. Чтобы сделать это, я обнаружил, что могу установить spark.master, используя:

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

Обновление моего ответа:

Чтобы быть ясным, это не то, что вы должны делать в производственной среде. В производственной среде spark.master следует указывать в одном из нескольких других мест: либо в $SPARK_HOME/conf/spark-defaults.conf(это будет клаудер клаудера), либо в командной строке при отправке приложение. (ex spark-submit --master пряжа).

Если вы укажете, что spark.master будет "локальным" таким образом, искра будет пытаться работать в одном jvm, как указано в комментариях ниже. Если вы затем попытаетесь указать кластер -deploy-mode, вы получите сообщение об ошибке "Режим развертывания кластеров несовместим с мастером" local ". Это связано с тем, что установка spark.master = local означает, что вы не работаете в режиме кластера.

Вместо этого для производственного приложения в вашей основной функции (или в функциях, вызываемых вашей основной функцией) вы должны просто использовать:

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

Это будет использовать конфигурации, указанные в командной строке/в файлах конфигурации.

Кроме того, чтобы быть понятным и в этом: --master и "spark.master" - это тот же самый параметр, который указывается по-разному. Установка spark.master в коде, как и в моем ответе выше, переопределит попытки установить --master и переопределит значения в spark-defaults.conf, поэтому не делайте этого в процессе производства. Однако он отлично подходит для тестов.

также см. этот ответ. который ссылается на список параметров для spark.master и то, что каждый на самом деле делает.

Ответ 4

Значение "spark.master" по умолчанию - искра://HOST: PORT, и следующий код пытается получить сеанс из автономного кластера, который работает в HOST: PORT, и ожидает, что значение HOST: PORT будет в файле конфигурации искры.

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

"org.apache.spark.SparkException: главный URL должен быть установлен в вашей конфигурации" указывает, что HOST: PORT не задан в файле конфигурации искры.

Чтобы не беспокоиться о значении "HOST: PORT", установите spark.master как локальный

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

Здесь - ссылка для списка форматов, в которых главный URL-адрес может быть передан в spark.master

Ответ 5

Как контекст искры в вашем приложении выбирает значение для искрового мастера?

  • Вы либо предоставляете его с помощью SparkConf при создании SC.
  • Или он выбирает из System.getProperties (где SparkSubmit ранее поставил его после чтения вашего аргумента --master).

Теперь SparkSubmit запускается в драйвере, который в вашем случае является машиной, с которой вы выполняете spark-submit script. И это, вероятно, работает так же, как и ожидалось для вас.

Однако из информации, которую вы опубликовали, похоже, что вы создаете контекст искры в коде, который отправляется исполнителю, и при отсутствии доступного там системного свойства spark.master он не работает. (И вы не должны этого делать, если это так.)

Можете ли вы отправить код GroupEvolutionES (в частности, где вы создаете SparkContext(s)).

Ответ 6

Замена:

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

Была ли магия.

Ответ 7

У меня была та же проблема: вот мой код перед изменением:

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[*]")

Все прошло отлично!

Ответ 8

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

Ответ 9

Если вы используете следующий код

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

Вам нужно добавить .master( "local [*]" ), если запуск локального здесь * означает все node, вы можете указать insted из 8 1,2 и т.д.

Вам нужно установить главный URL-адрес, если в кластере

Ответ 10

Нам не удалось установить 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()

Ответ 11

Если вы не предоставили конфигурацию Spark в JavaSparkContext, вы получите эту ошибку. То есть: JavaSparkContext sc = новый JavaSparkContext();

Решение: предоставить JavaSparkContext sc = новый JavaSparkContext (conf);