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 GroupEvolutionES
jest 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
scala
apache-spark
Shuai Zhang
źródło
źródło
Spark
projektu ( ). 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żejDataFrameSuiteBase
DataFrame
test(..) { .. }
DataFrame
lazy
Scala
Odpowiedzi:
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.
źródło
main()
metodę zamiast rozszerzaniascala.App
. Podklasyscala.App
mogą nie działać poprawnie”. Instrukcja Spark 2.1.0getOrCreate()
kontekst powinien zostać utworzony na poziomie sterownika i przekazany do poziomu wykonawcy w razie potrzeby.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
źródło
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.
źródło
setMaster("local[2]")
(byłoby miło mieć wyjaśnienie), ale tę odpowiedź można uznać za rozwiązanie problemu.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
źródło
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!
źródło
Jeśli używasz samodzielnej aplikacji, musisz użyć
SparkContext
zamiastSparkSession
val conf = new SparkConf().setAppName("Samples").setMaster("local") val sc = new SparkContext(conf) val textData = sc.textFile("sample.txt").cache()
źródło
.setMaster("local")
jest dla mnie kluczem do rozwiązania problemulocal
lublocal[*]
. Kiedy wdrażam go do AWS EMR, używa Yarn do koordynacji, a następnie ustawiam mistrza jakoyarn
W jaki sposób kontekst Spark w Twojej aplikacji wybiera wartość dla Spark Master?
SparkConf
podczas tworzenia SC.System.getProperties
(gdzie SparkSubmit wcześniej umieścił go po przeczytaniu--master
argumentu).Teraz
SparkSubmit
dział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.master
tam 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ć
GroupEvolutionES
kod (szczególnie tam, gdzie tworzyszSparkContext(s)
).źródło
main
funkcjach GroupEvolutionES (czego nie zrobiłem).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.
źródło
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
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")
źródło
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 {
źródło
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()
źródło
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
źródło
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);
źródło
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) }
źródło
Zamiast tego użyłem tego konstruktora SparkContext i zniknęły błędy:
val sc = new SparkContext("local[*]", "MyApp")
źródło