Spark - Błąd „Główny adres URL musi być ustawiony w konfiguracji” podczas przesyłania aplikacji

93

Mam aplikację Spark, która działa bez problemu w trybie lokalnym, ale mam pewne problemy podczas przesyłania do klastra Spark.

Komunikaty o błędzie są następujące:

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)

W powyższym kodzie GroupEvolutionESjest klasa główna. Komunikat o błędzie mówi „Główny adres URL musi być ustawiony w Twojej konfiguracji”, ale podałem parametr „--master” dospark-submit .

Każdy, kto wie, jak rozwiązać ten problem?

Wersja Spark: 1.6.1

Shuai Zhang
źródło
1
Czy mógłbyś wkleić tutaj polecenie, którego używasz do przesłania skryptu.
Shiv4nsh
Czy podałeś główny adres URL iskry?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULSHRESTHA Tak.
Shuai Zhang
Natknąłem się na to w testach jednostkowych mojego Sparkprojektu ( ). Z odpowiedzi @Dazzlera zrozumiałem, że muszę przenosić kreację do apartamentów. Ale także samo zadeklarowanie s jako rozwiązuje to (miłość !). Wskazuje na to @gyuseong w jego odpowiedzi poniżejDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
y2k-shubham

Odpowiedzi:

40

Gdzie zdefiniowano obiekt sparkContext, czy znajduje się on w funkcji głównej?

Ja również stanąłem przed tym samym problemem, błędem, który popełniłem, było zainicjowanie sparkContext poza główną funkcją i wewnątrz klasy.

Kiedy zainicjowałem to w głównej funkcji, działało dobrze.

Dazzler
źródło
11
Spark naprawdę musi się poprawić: wyświetla tylko bardzo mylące i pozbawione informacji komunikaty o błędach, gdy dzieje się coś złego
Shuai Zhang
3
To jest obejście, a nie rozwiązanie. A co, jeśli chcę utworzyć kontekst singletion i utworzyć osobną warstwę kontekstu oprócz funkcji głównej dla wielu aplikacji?
Murtaza Kanchwala
1
„Pamiętaj, że aplikacje powinny definiować main()metodę zamiast rozszerzania scala.App. Podklasy scala.Appmogą nie działać poprawnie”. Instrukcja Spark 2.1.0
ruhong
1
Zwróć uwagę na to, gdzie próbujesz, getOrCreate()kontekst powinien zostać utworzony na poziomie sterownika i przekazany do poziomu wykonawcy w razie potrzeby.
reim
139

TLDR:

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

lista opcji dla spark.master w Spark 2.2.1

Skończyło się na tej stronie po próbie uruchomienia prostego programu java Spark SQL w trybie lokalnym. Aby to zrobić, stwierdziłem, że mogę ustawić spark.master za pomocą:

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

Aktualizacja mojej odpowiedzi:

Aby było jasne, nie należy tego robić w środowisku produkcyjnym. W środowisku produkcyjnym spark.master powinien być określony w jednym z kilku innych miejsc: albo w $ SPARK_HOME / conf / spark-defaults.conf (w tym miejscu umieści go menedżer cloudera), albo w wierszu poleceń podczas przesyłania Aplikacja. (ex spark-submit --master yarn).

Jeśli w ten sposób określisz spark.master jako „lokalny”, Spark spróbuje uruchomić się w pojedynczym pliku jvm, jak wskazują poniższe komentarze. Jeśli następnie spróbujesz określić klaster w trybie wdrażania, zostanie wyświetlony komunikat o błędzie „Tryb wdrażania klastra nie jest zgodny z głównym„ lokalnym ””. Dzieje się tak, ponieważ ustawienie spark.master = local oznacza, że ​​NIE pracujesz w trybie klastra.

Zamiast tego w przypadku aplikacji produkcyjnej w ramach funkcji głównej (lub funkcji wywoływanych przez funkcję główną) należy po prostu użyć:

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

Spowoduje to użycie konfiguracji określonych w wierszu poleceń / w plikach konfiguracyjnych.

Ponadto, żeby to również było jasne: --master i "spark.master" to dokładnie ten sam parametr, tylko określony na różne sposoby. Ustawienie spark.master w kodzie, jak w mojej odpowiedzi powyżej, nadpisuje próby ustawienia --master i nadpisuje wartości w spark-defaults.conf, więc nie rób tego w środowisku produkcyjnym. Jest jednak świetny do testów.

Zobacz również tę odpowiedź . który prowadzi do listy opcji dla spark.master i tego, co każdy z nich faktycznie robi.

lista opcji dla spark.master w Spark 2.2.1

Jack Davidson
źródło
5
tak, dodanie ".config (" spark.master "," local ")" też działało.
Ashutosh S,
Dzięki, że zadziałało dla mnie - ale czy ktoś mógłby wyjaśnić nowicjuszowi (mnie), co robi .config ("spark.master", "local")? Czy mój kod będzie nadal dobrze skompilowany do pliku jar i uruchomiony w środowisku produkcyjnym?
user1761806
4
@ user1761806, chociaż wiele odpowiedzi podaje to jako poprawkę, zasadniczo zmienia to sposób, w jaki Spark przetwarza, używając tylko jednej maszyny JVM. Lokalny jest używany do testowania lokalnego i nie jest właściwym rozwiązaniem tego problemu, jeśli zamierzasz wdrożyć w klastrze. Miałem podobne problemy i zaakceptowana odpowiedź była właściwym rozwiązaniem mojego problemu.
Nathaniel Wendt
58

Pracował u mnie po wymianie

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");

z

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Znalazłem to rozwiązanie w innym wątku na stackoverflow.

Sachin
źródło
1
Panie, uratował mi dzień ... Dziękuję!
Hako,
3
Czy to rozwiązuje pytanie OP? Spowoduje to utworzenie lokalnego klastra w tej maszynie JVM, a nie podłączenie jej do autonomicznej w innym miejscu.
Azeroth2b
To rozwiązuje problem. Nie wiem (jeszcze) o konsekwencjach setMaster("local[2]")(byłoby miło mieć wyjaśnienie), ale tę odpowiedź można uznać za rozwiązanie problemu.
Rick
Właśnie zredagowałem odpowiedź, aby zawrzeć tę informację :)
Rick
26

Domyślną wartością „spark.master” jest spark: // HOST: PORT, a poniższy kod próbuje pobrać sesję z autonomicznego klastra działającego pod adresem HOST: PORT i oczekuje, że wartość HOST: PORT będzie w Spark plik konfiguracyjny.

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

org.apache.spark.SparkException: w konfiguracji musi być ustawiony główny adres URL ” stwierdza, że HOST: PORT nie jest ustawiony w pliku konfiguracyjnym Spark.

Aby nie zawracać sobie głowy wartością „HOST: PORT”, ustaw spark.master jako local

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

Tutaj link do listy formatów, w których można przekazać główny adres URL do spark.master

Odniesienie: samouczek Spark - Skonfiguruj ekosystem Spark

Mallikarjun M
źródło
Dziękuję bardzo, że uratowałeś mi dzień!
GentleCoder
7

po prostu dodaj .setMaster("local")do swojego kodu, jak pokazano poniżej:

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

U mnie zadziałało! Miłego kodowania!

kumar sanu
źródło
6

Jeśli używasz samodzielnej aplikacji, musisz użyć SparkContextzamiastSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
źródło
5
.setMaster("local")jest dla mnie kluczem do rozwiązania problemu
tom10271
Co jeśli mam to ustawione, ale nadal mam ten błąd? @ tom10271
Anna Leonenko
@AnnaLeonenko Przepraszam, ale od roku przestałem tworzyć aplikację Spark, nie mogę sobie przypomnieć. Ale myślę, że twój węzeł główny nie jest lokalny, którym zarządza iskra, ale przędza?
tom10271
1
@AnnaLeonenko Sprawdziłem swoje ustawienia. Kiedy uruchamiałem go lokalnie w celu programowania i używam Spark tylko do zarządzania węzłem głównym, ustawię go na locallub local[*]. Kiedy wdrażam go do AWS EMR, używa Yarn do koordynacji, a następnie ustawiam mistrza jakoyarn
tom10271
3

W jaki sposób kontekst Spark w Twojej aplikacji wybiera wartość dla Spark Master?

  • Albo zapewniasz to wprost SparkConf podczas tworzenia SC.
  • Lub wybiera z System.getProperties(gdzie SparkSubmit wcześniej umieścił go po przeczytaniu --masterargumentu).

Teraz SparkSubmitdziała na sterowniku - który w twoim przypadku jest maszyną, z której wykonujeszspark-submit skrypt. I to prawdopodobnie działa zgodnie z oczekiwaniami.

Jednak z opublikowanych informacji wynika, że ​​tworzysz kontekst iskry w kodzie, który jest wysyłany do modułu wykonawczego - a biorąc pod uwagę, że nie ma spark.mastertam dostępnej właściwości systemowej, kończy się to niepowodzeniem. (I naprawdę nie powinieneś tego robić, jeśli tak jest).

Czy możesz opublikować GroupEvolutionESkod (szczególnie tam, gdzie tworzysz SparkContext(s)).

Sachin Tyagi
źródło
1
Tak. Powinienem był utworzyć SparkContext w mainfunkcjach GroupEvolutionES (czego nie zrobiłem).
Shuai Zhang
1
To jest obejście, a nie rozwiązanie. A co, jeśli chcę utworzyć kontekst singletion i utworzyć osobną warstwę kontekstu oprócz funkcji głównej dla wielu aplikacji? Jakieś uwagi na temat tego, jak mogę to osiągnąć?
Murtaza Kanchwala
2

Wymiana:

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

Czy magia.

Nazima
źródło
5
Czy Twoje rozwiązanie nie jest dokładnie takie samo, jak to, co opublikował @Sachin?
Akavall
dlaczego lokalny [2] możesz wyjaśnić
SUDARSHAN
o lokalnym [2] -> stackoverflow.com/questions/32356143/…
raevilman
2

Miałem ten sam problem, oto mój kod przed modyfikacją:

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

}

A po wymianie:

val conf = new SparkConf().setAppName("wordCount")

Z :

val conf = new SparkConf().setAppName("wordCount").setMaster("local[*]")

Działało dobrze!


źródło
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")
Rio
źródło
To rozwiązanie zadziałało dla mnie. Dzięki, że to umieściłeś. @Mario.
Siwoku Adeola
2

Spróbuj tego

zrobić cechę

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

przedłuża to

object Preprocess extends SparkSessionWrapper {
gyuseong
źródło
1

Brakuje setMaster („local [*]”) do ustawienia. Po dodaniu problem zostanie rozwiązany.

Problem:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .getOrCreate()

rozwiązanie:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .master("local[*]")
      .getOrCreate()
KARTHIKEYAN.A
źródło
0

Jeśli używasz następującego kodu

 val sc = new SparkContext(master, "WordCount", System.getenv("SPARK_HOME"))

Następnie zastąp następującymi wierszami

  val jobName = "WordCount";
  val conf = new SparkConf().setAppName(jobName);
  val sc = new SparkContext(conf)

W Spark 2.0 możesz użyć następującego kodu

val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .master("local[*]")// need to add
  .getOrCreate()

Musisz dodać .master ("local [*]"), jeśli uruchomienie lokalnego * oznacza cały węzeł, możesz powiedzieć, że instancja 8 1,2 itd.

Musisz ustawić główny adres URL, jeśli w klastrze

vaquar khan
źródło
0

Jeśli nie podasz konfiguracji Spark w JavaSparkContext, pojawi się ten błąd. To znaczy: JavaSparkContext sc = new JavaSparkContext ();

Rozwiązanie: podaj JavaSparkContext sc = new JavaSparkContext (conf);

Rimi Gandhi
źródło
0

Wypróbowano tę opcję podczas uczenia się przetwarzania platformy Spark z konfigurowaniem kontekstu Spark na komputerze lokalnym. Wymaganie 1) Utrzymaj sesję Spark w trybie lokalnym 2) Dodaj zależność Spark maven 3) Zachowaj plik wejściowy w katalogu głównym \ folderze wejściowym 4) dane wyjściowe zostaną umieszczone w folderze \ output. Uzyskanie maksymalnej wartości akcji za rok. pobierz dowolny plik CSV z Yahoo Finance https://in.finance.yahoo.com/quote/CAPPL.BO/history/ zależność Maven i kod Scala poniżej -

<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)
  }
Vik_Technologist
źródło
0

Zamiast tego użyłem tego konstruktora SparkContext i zniknęły błędy:

val sc = new SparkContext("local[*]", "MyApp")
remondo
źródło