Spark - Ошибка «В конфигурации должен быть указан главный URL» при отправке приложения.


93

У меня есть приложение Spark, которое работает без проблем в локальном режиме, но имеет некоторые проблемы при отправке в кластер Spark.

Сообщение об ошибке выглядит следующим образом:

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это основной класс. В сообщении об ошибке говорится: «В вашей конфигурации должен быть установлен главный URL», но я предоставил параметр «--master» для spark-submit.

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

Версия Spark: 1.6.1


1
Не могли бы вы вставить сюда команду, которую вы используете для отправки скрипта.
Shiv4nsh

Вы указали основной URL-адрес искры?
Kshitij Kulshrestha

@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Zhang

@KSHITIJKULSHRESTHA Да.
Шуай Чжан,

Я столкнулся с этим в модульных тестах моего Sparkпроекта ( ). Из ответа @Dazzler я понял, что я должен переместить -creation в апартаменты. Но также простое объявление s исправляет это (любовь !). На это указал @gyuseong в его ответе нижеDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
y2k-shubham

Ответы:


40

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

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

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


11
Spark действительно нуждается в улучшении: он просто показывает очень запутанные и неинформативные сообщения об ошибках, когда что-то не так,
Шуай Чжан,

3
Это обходной путь, а не решение. Что, если я хочу создать единичный контекст и создать отдельный уровень контекста, помимо основной функции для нескольких приложений?
Murtaza Kanchwala

1
«Обратите внимание, что приложения должны определять main()метод вместо расширения scala.App. Подклассы scala.Appмогут работать некорректно». Spark 2.1.0 Manual
ruhong

1
Обратите внимание на то, где вы пытаетесь getOrCreate()создать контекст на уровне драйвера и передать его на уровень исполнителя по мере необходимости.
Рейм

139

TL; DR:

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

список опций Spark.master в Spark 2.2.1

Я оказался на этой странице после попытки запустить простую 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 (это то место, где его поместит менеджер cloudera), либо в командной строке при отправке. приложение. (ex spark-submit --master yarn).

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

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

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

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

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

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

список опций Spark.master в Spark 2.2.1


5
да, добавление ".config (" spark.master "," local ")" у меня тоже сработало.
Ashutosh S

Спасибо, это сработало для меня - но может ли кто-нибудь объяснить новичку (мне), что делает .config ("spark.master", "local")? Можно ли будет скомпилировать мой код в jar и запустить его в продакшене?
user1761806 03

4
@ user1761806, хотя многие ответы сообщают об этом как об исправлении, он коренным образом меняет способ обработки искры, используя только одну JVM. Локальный используется для локального тестирования и не является правильным решением для устранения этой проблемы, если вы собираетесь выполнить развертывание в кластере. У меня были похожие проблемы, и принятый ответ был правильным решением моей проблемы.
Натаниэль Вендт

58

Сработало у меня после замены

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.


1
Вы, сэр, спасли мне день ... Спасибо!
Hako

3
Решает ли это вопрос ОП? Это создает локальный кластер в этой JVM, а не подключается к автономному в другом месте.
Azeroth2b 08

Это решает проблему. Я не знаю (пока) о последствиях setMaster("local[2]")(было бы неплохо получить объяснение), но этот ответ можно считать решением проблемы.
Rick

Я только что отредактировал ответ, чтобы включить эту информацию :)
Рик

26

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

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

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

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

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

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

Ссылка: Учебное пособие по Spark - Настройка экосистемы Spark


Большое вам спасибо, что вы спасли мне день!
GentleCoder 05

7

просто добавьте .setMaster("local")в свой код, как показано ниже:

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

У меня это сработало! Удачного кодирования!


6

Если вы запускаете автономное приложение, вам нужно использовать SparkContextвместоSparkSession

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

5
.setMaster("local")- ключ к решению проблемы для меня
tom10271

Что делать, если он установлен, но ошибка все еще сохраняется? @ tom10271
Анна Леоненко

@AnnaLeonenko Прошу прощения, но я уже год прекратил разработку приложения Spark, не могу вспомнить свою память. Но я думаю, ваш главный узел не локальный, которым управляет искра, а пряжа?
tom10271

1
@AnnaLeonenko Я проверил свои настройки. Когда я запускал его локально для разработки и использую Spark только для управления главным узлом, я установил для него значение localили local[*]. Когда я развертываю его в AWS EMR, он использует Yarn для координации, затем я устанавливаю мастер какyarn
tom10271,

3

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

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

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

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

Не могли бы вы опубликовать GroupEvolutionESкод (конкретно там, где вы создаете SparkContext(s)).


1
Да. Я должен был создать SparkContext в mainфункциях GroupEvolutionES (чего я не делал).
Шуай Чжан,

1
Это обходной путь, а не решение. Что, если я хочу создать единичный контекст и создать отдельный уровень контекста, помимо основной функции для нескольких приложений? Есть комментарии о том, как я могу этого добиться?
Murtaza Kanchwala

2

Замена:

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

Совершил волшебство.


5
Разве ваше решение не совпадает с тем, что опубликовал @Sachin?
Akavall

почему местные [2] вы можете объяснить
СУДАРШАН


2

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

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

Работало нормально!


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

Это решение сработало для меня. Спасибо, что разместили. @ Марио.
Siwoku Adeola

2

попробуй это

сделать черту

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

расширяет это

object Preprocess extends SparkSessionWrapper {

1

Нам не хватает 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()

0

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

 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 [*]"), если запуск здесь local * означает весь узел, вы можете сказать insted из 8 1,2 и т. Д.

Вам необходимо установить мастер-URL, если в кластере


0

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

Решение: укажите JavaSparkContext sc = new JavaSparkContext (conf);


0

Пробовал этот вариант при изучении обработки Spark с настройкой контекста Spark на локальном компьютере. Необходимое условие 1) Сохранять сеанс Spark в локальном режиме 2) Добавить зависимость Spark от maven 3) Сохранять входной файл в корневой папке \ input 4) Выходные данные будут помещены в папку \ output. Получение максимальной стоимости акций за год. загрузите любой CSV из Yahoo Finance https://in.finance.yahoo.com/quote/CAPPL.BO/history/ Зависимость Maven и код Scala ниже -

<dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.4.3</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>   

object MaxEquityPriceForYear {
  def main(args: Array[String]) {
    val sparkConf = new SparkConf().setAppName("ShareMaxPrice").setMaster("local[2]").set("spark.executor.memory", "1g");
    val sc = new SparkContext(sparkConf);
    val input = "./input/CAPPL.BO.csv"
    val output = "./output"
    sc.textFile(input)
      .map(_.split(","))
      .map(rec => ((rec(0).split("-"))(0).toInt, rec(1).toFloat))
      .reduceByKey((a, b) => Math.max(a, b))
      .saveAsTextFile(output)
  }

0

Вместо этого я использовал этот конструктор SparkContext, и ошибки исчезли:

val sc = new SparkContext("local[*]", "MyApp")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.