У меня есть приложение 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
scala
apache-spark
Шуай Чжан
источник
источник
Spark
проекта ( ). Из ответа @Dazzler я понял, что я должен переместить -creation в апартаменты. Но также простое объявление s исправляет это (любовь !). На это указал @gyuseong в его ответе нижеDataFrameSuiteBase
DataFrame
test(..) { .. }
DataFrame
lazy
Scala
Ответы:
Где определен объект sparkContext, находится ли он внутри основной функции?
Я тоже столкнулся с той же проблемой, ошибка, которую я сделал, заключалась в том, что я инициировал sparkContext вне основной функции и внутри класса.
Когда я инициировал его внутри основной функции, он работал нормально.
источник
main()
метод вместо расширенияscala.App
. Подклассыscala.App
могут работать некорректно». Spark 2.1.0 ManualgetOrCreate()
создать контекст на уровне драйвера и передать его на уровень исполнителя по мере необходимости.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
источник
Сработало у меня после замены
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.
источник
setMaster("local[2]")
(было бы неплохо получить объяснение), но этот ответ можно считать решением проблемы.Значение по умолчанию "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
источник
просто добавьте
.setMaster("local")
в свой код, как показано ниже:val conf = new SparkConf().setAppName("Second").setMaster("local")
У меня это сработало! Удачного кодирования!
источник
Если вы запускаете автономное приложение, вам нужно использовать
SparkContext
вместоSparkSession
val conf = new SparkConf().setAppName("Samples").setMaster("local") val sc = new SparkContext(conf) val textData = sc.textFile("sample.txt").cache()
источник
.setMaster("local")
- ключ к решению проблемы для меняlocal
илиlocal[*]
. Когда я развертываю его в AWS EMR, он использует Yarn для координации, затем я устанавливаю мастер какyarn
Как контекст искры в вашем приложении выбирает значение для мастера искры?
SparkConf
при создании SC.System.getProperties
(где SparkSubmit ранее поместил его после прочтения вашего--master
аргумента).Теперь
SparkSubmit
запускается драйвер, который в вашем случае является машиной, с которой вы выполняетеspark-submit
скрипт. И это, вероятно, работает и у вас так, как ожидалось.Однако из информации, которую вы опубликовали, похоже, что вы создаете контекст искры в коде, который отправляется исполнителю - и, учитывая, что там нет
spark.master
доступных системных свойств, это не удается. (И вам не следует этого делать, если это так.)Не могли бы вы опубликовать
GroupEvolutionES
код (конкретно там, где вы создаетеSparkContext(s)
).источник
main
функциях GroupEvolutionES (чего я не делал).Замена:
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");
Совершил волшебство.
источник
У меня была такая же проблема, вот мой код до модификации:
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[*]")
Работало нормально!
источник
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")
источник
попробуй это
сделать черту
import org.apache.spark.sql.SparkSession trait SparkSessionWrapper { lazy val spark:SparkSession = { SparkSession .builder() .getOrCreate() } }
расширяет это
object Preprocess extends SparkSessionWrapper {
источник
Нам не хватает 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()
источник
Если вы используете следующий код
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, если в кластере
источник
Если вы не предоставите конфигурацию Spark в JavaSparkContext, вы получите эту ошибку. То есть: JavaSparkContext sc = new JavaSparkContext ();
Решение: укажите JavaSparkContext sc = new JavaSparkContext (conf);
источник
Пробовал этот вариант при изучении обработки 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) }
источник
Вместо этого я использовал этот конструктор SparkContext, и ошибки исчезли:
val sc = new SparkContext("local[*]", "MyApp")
источник