Іскра - Помилка "Основна 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
Shuai Zhang

@KSHITIJKULSHRESTHA Так.
Шуай Чжан,

Я зіткнувся з цим у модульних тестах свого Sparkпроекту ( ). З відповіді @Dazzler я зрозумів, що я повинен рухатися - відпочинок всередині люксів. Але також просто оголошення s для виправлення (любов !). На це вказував be @gyuseong у його відповіді нижчеDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
y2k-shubham

Відповіді:


40

Де визначено об'єкт sparkContext, він знаходиться всередині головної функції?

Я теж зіткнувся з тією ж проблемою, помилкою, яку я зробив, було те, що я ініціював sparkContext поза основною функцією та всередині класу.

Коли я ініціював його всередині основної функції, він працював нормально.


11
Spark дійсно потрібно вдосконалити: він просто показує дуже заплутані та неінформативні повідомлення про помилки, коли трапляється щось не так
Шуай Чжан,

3
Це обхідний шлях, а не рішення. Що робити, якщо я хочу створити Singletion Context і створити окремий шар Context, крім основної функції для декількох додатків?
Муртаза Канчвала

1
"Зауважте, що програми повинні визначати main()метод, а не розширювати scala.App. Підкласи scala.Appможуть працювати неправильно." Spark 2.1.0 Manual
ruhong

Зверніть увагу на те, де ви намагаєтесь, щоб getOrCreate()контекст повинен бути створений на рівні драйвера і передаватись на рівень виконавця за потреби.
рейм

131

TLDR:

.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), або в командному рядку, коли ви надсилаєте додаток. (колишня іскра-подати --майстер пряжа).

Якщо ви вказали spark.master як "локальний" таким чином, spark спробує запустити в одному jvm, як зазначено в коментарях нижче. Якщо ви спробуєте вказати кластер --deploy-mode, ви отримаєте повідомлення про помилку "Режим розгортання кластера не сумісний з головним" локальним "". Це тому, що встановлення 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 ")" також спрацювало у мене.
Ашутош С,

Дякую, це спрацювало для мене - але хтось може пояснити новачкові (мені), що робить .config ("spark.master", "local")? Чи буде мій код все ще добре компілювати в банку та запускати у виробництво?
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
Ви, сер, врятували мій день ... Дякую!
Хако

3
Чи вирішує це питання ОП? Це створює локальний кластер у цій JVM, а не приєднується до автономного деінде.
Azeroth2b

Це вирішує проблему. Я не знаю (поки) про наслідки setMaster("local[2]")(було б непогано мати пояснення), але цю відповідь можна вважати рішенням проблеми.
Рік

Я щойно відредагував відповідь, включивши цю інформацію :)
Рік,

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

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

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

Ось посилання на список форматів, в яких головну URL-адресу можна передати spark.master

Довідково: Підручник з Spark - Налаштування екосистеми Spark


Велике спасибі, що ти врятував мій день!
GentleCoder

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, він використовує пряжу для координації, тоді я встановлюю master якyarn
tom10271

6

просто додайте .setMaster("local")до свого коду, як показано нижче:

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

У мене це вийшло! Щасливого кодування!


3

Як контекст spark у вашому додатку вибирає значення для master master?

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

Тепер SparkSubmitпрацює на драйвері - у вашому випадку це машина, з якої ви виконуєтеspark-submit сценарій. І це, мабуть, працює, як очікувалося, і для вас.

Однак з опублікованої вами інформації виглядає так, ніби ви створюєте іскровий контекст у коді, який надсилається виконавцю - і враховуючи, що немає spark.master доступних системних властивостей, це не вдається. (І ви насправді не повинні цього робити, якщо це так.)

Чи можете ви розмістити GroupEvolutionESкод (конкретно там, де ви створюєте SparkContext(s))?


1
Так. Я повинен був створити SparkContext у mainфункціях GroupEvolutionES (чого я не робив).
Шуай Чжан

1
Це обхідний шлях, а не рішення. Що робити, якщо я хочу створити Singletion Context і створити окремий шар Context, крім основної функції для декількох додатків? Будь-які коментарі щодо того, як я можу цього досягти?
Муртаза Канчвала

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?
Акавалл

чому місцеві [2] можете пояснити
СУДАРШАН

про локальну [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")

Це рішення було тим, що спрацювало для мене. Дякую, що поставили. @Mario.
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 of 8 1,2 і т.д.

Вам потрібно встановити головну URL-адресу, якщо в кластері


0

Якщо ви не надаєте конфігурацію Spark у JavaSparkContext, ви отримуєте цю помилку. Тобто: JavaSparkContext sc = new JavaSparkContext ();

Рішення: Надайте JavaSparkContext sc = new JavaSparkContext (conf);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.