Spark-ошибка "основной URL должен быть установлен в вашей конфигурации" при отправке приложения



у меня есть приложение Spark,которое работает без проблем в локальном режиме, но есть некоторые проблемы при отправке в кластер Spark.



ошибка msg выглядит следующим образом:



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.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob.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.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob.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 - это основной класс. Ошибка msg говорит: "главный URL должен быть установлен в вашей конфигурации", но я предоставил параметр "--master " для spark-submit.



кто знает, как решить эту проблему?



Искра версия: 1.6.1

724   13  

13 ответов:

где определен объект sparkContext, находится ли он внутри основной функции?

Я тоже столкнулся с той же проблемой, ошибка, которую я сделал, была инициирована sparkContext вне основной функции и внутри класса.

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

я оказался на этой странице после попытки запустить простую программу Spark SQL java в локальном режиме. Для этого я обнаружил, что могу установить искру.мастер с помощью:

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

обновление к моему ответу:

чтобы было понятно, это не то, что вы должны делать в производственной среде. В производственной среде, Искра.мастер должен быть указан в одном из нескольких других мест: либо в $SPARK_HOME/conf/spark-defaults.conf (это где менеджер cloudera положит его), или на командная строка при отправке приложения. (бывший СПАРК-представить-мастер пряжа).

Если вы укажете искру.мастер, чтобы быть "локальным" таким образом, spark попытается запустить в одной jvm, как указано в комментариях ниже. Если вы затем попытаетесь указать -- deploy-mode cluster, вы получите сообщение об ошибке 'Cluster deploy mode не совместим с master "local"'. Это потому, что установка зажигания.master=local означает, что вы не работаете в режиме кластера.

вместо этого, для производственного приложения, в пределах ваша основная функция (или в функциях, вызываемых вашей основной функцией), вы должны просто использовать:

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

это будет использовать конфигурации, указанные в командной строке / в файлах конфигурации.

кроме того, чтобы быть ясным в этом тоже: --Мастер и "Искра.master " - это точно такой же параметр, только указанный по-разному. Установка зажигания.мастер в коде, как и в моем ответе выше, переопределит попытки установить --master и переопределит значения в spark-defaults.конф, так что не делай этого в производстве. Его отлично подходит для тестов, хотя.

Также см. ответ. какие ссылки список опций для spark.мастер и что каждый из них на самом деле.

список опций для spark.мастер в 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.

значение по умолчанию "spark.master " - это spark: / / HOST: PORT, и следующий код пытается получить сеанс из автономного кластера, который работает в ХОСТ:ПОРТ, и ожидает, что значение HOST: PORT будет в файле конфигурации spark.

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

"орг.апаш.искра.SparkException: главный URL должен быть установлен в вашей конфигурации" указано, что ХОСТ:ПОРТ не задано в файле конфигурации spark.

чтобы не заморачиваться значение "HOST: PORT", set Искра.мастер как local

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

здесь - это ссылка на список форматов, в которых основной URL может быть передан в spark.мастер

ссылки : Spark Tutorial -Настройка Spark Экосистемы

как контекст spark в вашем приложении выбирает значение для Spark master?

  • вы либо предоставляете его явно в пределах SparkConf при создании SC.
  • или он выбирает из System.getProperties (где SparkSubmit ранее поставил его после прочтения вашего

замена :

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 {

Если вы используете следующий код

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

нужно добавить .мастер("локальной [*]"), если подножка здесь местные * означает, что все вершины , вы можете сказать вместо 8 1,2 и т. д.

вам нужно установить главный URL, если на кластере

нам не хватает 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()

Если вы используете отдельное приложение, то вы должны использовать SparkContext вместо SparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()

Если вы не предоставляете конфигурацию Spark в JavaSparkContext, то вы получаете эту ошибку. То есть: JavaSparkContext sc = новый JavaSparkContext ();

решение: предоставить JavaSparkContext sc = new JavaSparkContext (conf);

Comments

    Ничего не найдено.