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 вне основной функции и внутри класса.

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

Dazzler
источник
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] вы можете объяснить
СУДАРШАН
about local [2] -> stackoverflow.com/questions/32356143/…
raevilman
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")
Ремондо
источник