Spark - Bir uygulamayı gönderirken "Yapılandırmanızda bir ana URL ayarlanmalıdır" hatası


94

Yerel modda sorunsuz çalışan bir Spark uygulamam var, ancak Spark kümesine gönderirken bazı sorunlar yaşıyorum.

Hata mesajı aşağıdaki gibidir:

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)

Yukarıdaki kodda GroupEvolutionESana sınıftır. Hata mesajı "Yapılandırmanızda bir ana URL ayarlanmalıdır" diyor, ancak "--master" parametresini için sağladım spark-submit.

Bu sorunu nasıl çözeceğini bilen var mı?

Spark sürümü: 1.6.1


1
Komut dosyasını göndermek için kullandığınız komutu buraya yapıştırır mısınız?
Shiv4nsh

Kıvılcım ana URL'sini sağladınız mı?
Kshitij Kulshrestha

@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang

@KSHITIJKULSHRESTHA Evet.
Shuai Zhang

Benim bu karşılaştım Sparkprojenin birimi testler ( DataFrameSuiteBase). Gönderen @Dazzler 'ın cevabı, ben hareket etmek zorunda olduğunu anladı DataFrame-Creation iç test(..) { .. }suit. Ama aynı zamanda sadece ilan DataFrames olmayalazy düzeltmeleri o (aşk Scala!). Bu olmuştur sivri dışarı @gyuseong içinde onun cevabını aşağıda
y2k-Shubham

Yanıtlar:


40

SparkContext nesnesi nerede tanımlanır, ana işlevin içinde mi?

Ben de aynı sorunla karşılaştım, yaptığım hata, sparkContext'i ana işlevin dışında ve sınıf içinde başlatmamdı.

Ana işlevin içinde başlattığımda iyi çalıştı.


11
Spark'ın gerçekten iyileştirilmesi gerekiyor: Yanlış bir şey olduğunda çok kafa karıştırıcı ve bilgilendirici olmayan hata mesajları gösteriyor
Shuai Zhang

3
Bu bir çözüm değil, geçici bir çözüm. Ya bir Tekli Bağlam oluşturmak ve birden çok uygulama için ana işlevden ayrı bir Bağlam katmanı oluşturmak istersem?
Murtaza Kanchwala

1
"Uygulamaların main()genişletmek yerine bir yöntem tanımlaması gerektiğini unutmayın scala.App. Alt sınıfları scala.Appdoğru çalışmayabilir." Spark 2.1.0 El Kitabı
ruhong

1
getOrCreate()Bir bağlamı nerede denediğinize dikkat edin , sürücü düzeyinde oluşturulmalı ve gerektiğinde uygulayıcı düzeyine aktarılmalıdır.
2018

144

TLDR:

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

spark 2.2.1'deki spark.master seçeneklerinin listesi

Yerel modda basit bir Spark SQL java programını çalıştırmayı denedikten sonra bu sayfaya geldim. Bunu yapmak için, spark.master'ı kullanarak ayarlayabileceğimi öğrendim:

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

Cevabım için bir güncelleme:

Açık olmak gerekirse, üretim ortamında yapmanız gereken bu değil. Bir üretim ortamında, spark.master başka birkaç yerden birinde belirtilmelidir: ya $ SPARK_HOME / conf / spark-defaults.conf (bu, cloudera yöneticisinin koyacağı yerdir) veya gönderdiğinizde komut satırında uygulama. (kıvılcım gönder - ana iplik).

Spark.master'ı bu şekilde 'yerel' olarak belirtirseniz, spark aşağıdaki yorumlarda belirtildiği gibi tek bir jvm'de çalışmayı deneyecektir. Daha sonra --deploy-mode kümesini belirtmeye çalışırsanız, "Küme dağıtım modu ana" yerel "ile uyumlu değil" hatası alırsınız. Bunun nedeni, spark.master = local ayarının küme modunda çalışmadığınız anlamına gelmesidir.

Bunun yerine, bir üretim uygulaması için, ana işlevinizin içinde (veya ana işleviniz tarafından çağrılan işlevlerde), şunları kullanmanız yeterlidir:

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

Bu, komut satırında / yapılandırma dosyalarında belirtilen yapılandırmaları kullanacaktır.

Ayrıca, bu konuda da açık olmak gerekirse: --master ve "spark.master", sadece farklı şekillerde belirtilen tam olarak aynı parametrelerdir. Yukarıdaki cevabımdaki gibi spark.master'ı kodda ayarlamak --master ayarlama girişimlerini geçersiz kılacak ve spark-defaults.conf içindeki değerleri geçersiz kılacaktır, bu yüzden bunu üretimde yapmayın. Yine de testler için harika.

ayrıca, bu yanıta bakın . hangi bağlantılar spark.master için seçenekler listesinden ve her birinin gerçekten oluyor.

spark 2.2.1'deki spark.master seçeneklerinin listesi


5
evet, ".config (" spark.master "," local ")" eklemek de benim için çalıştı.
Ashutosh S

Teşekkürler bu benim için çalıştı - ama birisi acemiye (ben) .config'in ("spark.master", "local") ne yaptığını açıklayabilir mi? Kodum hala bir kavanozda derlenip üretimde çalışacak mı?
user1761806

4
@ user1761806 yanıtların çoğu bunu bir düzeltme olarak bildirirken, yalnızca tek bir JVM kullanarak kıvılcım işlemlerini temelden değiştirir. Yerel, yerel test için kullanılır ve bir kümeye dağıtmayı planlıyorsanız bu sorunu çözmek için doğru çözüm değildir. Benzer sorunlarım vardı ve kabul edilen yanıt sorunumun doğru çözümü oldu.
Nathaniel Wendt

59

Değiştirdikten sonra benim için çalıştı

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

ile

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

Bu çözümü stackoverflow'daki başka bir iş parçacığında buldum.


1
Siz bayım, günümü kurtardınız ... Teşekkürler!
Hako

3
Bu, OP'nin sorusunu çözüyor mu? Bu, bu JVM'de yerel bir küme oluşturur, başka bir yerde tek başına bir küme bağlanmaz.
Azeroth2b

Bu sorunu çözer. ( setMaster("local[2]")Bir açıklamanın olması güzel olurdu ) anlamını (henüz) bilmiyorum , ancak bu yanıt sorunun çözümü olarak düşünülebilir.
Rick

Yanıtı bu bilgileri içerecek şekilde düzenledim :)
Rick

26

Şekilde çalıştıran bağımsız kümeden bir oturum almak için PORT ve aşağıdaki kod çalışır: // HOST: "spark.master" varsayılan değeri kıvılcımı HOST: PORT ve HOST bekler: PORT değeri olmak spark yapılandırma dosyası.

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

" org.apache.spark.SparkException: Yapılandırmanızda bir ana URL ayarlanmalıdır " , spark yapılandırma dosyasında HOST: PORT'un ayarlanmadığını belirtir .

": PORT ANA", ayarlanan değeri hakkında rahatsız etmek spark.master olarak yerel

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

İşte ana URL'nin spark.master'a aktarılabileceği biçimlerin listesi için bağlantı.

Referans: Spark Eğitimi - Spark Ekosistemini Kurun


Çok teşekkür ederim günümü kurtardın!
GentleCoder

7

.setMaster("local")kodunuza aşağıda gösterildiği gibi eklemeniz yeterlidir:

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

Benim için çalıştı! Mutlu kodlamalar!


6

Bağımsız bir uygulama çalıştırıyorsanız, SparkContextbunun yerine kullanmanız gerekirSparkSession

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

5
.setMaster("local")benim için sorunu çözmenin anahtarı
tom10271

Ya ayarladıysam ancak hala bu hatayı alıyorsam? @ tom10271
Anna Leonenko

@AnnaLeonenko Üzgünüm ancak Spark uygulamasını geliştirmeyi bir yıldır durdurdum, hafızamı hatırlayamıyorum. Ama sanırım ana düğümünüz kıvılcımla yönetilen yerel değil, iplik?
tom10271

1
@AnnaLeonenko Ayarlarımı kontrol ettim. Geliştirme için yerel olarak çalıştırdığımda ve Spark'ı yalnızca ana düğümü yönetmek için kullandığımda, localveya olarak ayarlayacağım local[*]. Bunu AWS yarn
EMR'ye dağıttığımda

3

Uygulamanızdaki spark context, spark master değerini nasıl seçiyor?

  • Ya SC'yi oluştururken açık bir şekilde sağlarsınız SparkConf.
  • Ya da System.getProperties(SparkSubmit'in --masterargümanınızı okuduktan sonra koyduğu yer ).

Şimdi, SparkSubmitsürücü üzerinde çalışıyor - bu sizin durumunuzda, spark-submitkomut dosyasını çalıştırdığınız makinedir . Ve bu muhtemelen sizin için de beklendiği gibi çalışıyor.

Ancak, gönderdiğiniz bilgilerden, yürütücüye gönderilen kodda bir kıvılcım bağlamı oluşturuyormuşsunuz gibi görünüyor - ve orada kullanılabilir bir spark.mastersistem özelliği olmadığı göz önüne alındığında , başarısız oluyor. (Ve eğer durum buysa, bunu gerçekten yapmamalısınız.)

Lütfen gönderebilir misin GroupEvolutionES kodu (özellikle yarattığınız yere SparkContext(s)) misiniz?


1
Evet. SparkContext'i GroupEvolutionES mainişlevlerinde oluşturmalıydım (ki yapmadım).
Shuai Zhang

1
Bu bir çözüm değil, geçici bir çözüm. Ya bir Tekli Bağlam oluşturmak ve birden çok uygulama için ana işlevden ayrı bir Bağlam katmanı oluşturmak istersem? Bunu nasıl başarabileceğime dair herhangi bir yorumunuz var mı?
Murtaza Kanchwala

2

Değiştiriliyor:

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

Sihir yaptım.


5
Çözümünüz @Sachin'in gönderdiği ile tamamen aynı değil mi?
Akavall

neden yerel [2] açıklayabilir misin
SUDARSHAN


2

Aynı sorunu yaşadım, İşte değişiklikten önceki kodum:

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

}

Ve değiştirdikten sonra:

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

İle :

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

İyi çalıştı!


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

Bu çözüm benim için işe yarayan şeydi. Kurduğun için teşekkürler. @Mario.
Siwoku Adeola

2

bunu dene

özellik yapmak

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

uzatır

object Preprocess extends SparkSessionWrapper {

1

Ayarlanacak setMaster ("yerel [*]") eksik . Ekledikten sonra sorun çözülür.

Sorun:

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

çözüm:

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

0

Aşağıdaki kodu kullanıyorsanız

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

Ardından aşağıdaki satırlarla değiştirin

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

Spark 2.0'da aşağıdaki kodu kullanabilirsiniz

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

.Master ("local [*]") eklemeniz gerekir, eğer burada yerel çalıştırıyorsanız * tüm düğüm anlamına geliyorsa, 8 1,2 vb.

Küme üzerindeyse Ana URL'yi ayarlamanız gerekir


0

JavaSparkContext'te Spark yapılandırması sağlamazsanız, bu hatayı alırsınız. Yani: JavaSparkContext sc = new JavaSparkContext ();

Çözüm: JavaSparkContext sc = new JavaSparkContext (conf) sağlayın;


0

Bu seçeneği, yerel makinede Spark bağlamını ayarlayarak Spark işlemeyi öğrenirken denedim. Gereksinim 1) Spark oturumunun yerelde çalışmasını sağlayın 2) Spark maven bağımlılığı ekleyin 3) Giriş dosyasını kök \ girdi klasöründe tutun 4) çıktı \ çıktı klasörüne yerleştirilecektir. Yıl için maksimum hisse değeri elde etmek. yahoo finansından herhangi bir CSV'yi indirin https://in.finance.yahoo.com/quote/CAPPL.BO/history/ Maven bağımlılığı ve aşağıdaki Scala kodu -

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

0

Bunun yerine bu SparkContext yapıcısını kullandım ve hatalar gitti:

val sc = new SparkContext("local[*]", "MyApp")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.