Spark - Kesalahan "URL master harus disetel dalam konfigurasi Anda" saat mengirimkan aplikasi

93

Saya memiliki aplikasi Spark yang berjalan tanpa masalah dalam mode lokal, tetapi mengalami beberapa masalah saat mengirimkan ke cluster Spark.

Pesan kesalahannya adalah sebagai berikut:

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)

Pada kode diatas, GroupEvolutionESmerupakan kelas utama. Pesan kesalahan mengatakan "URL master harus disetel dalam konfigurasi Anda", tetapi saya telah memberikan parameter "--master" ke spark-submit.

Adakah yang tahu cara memperbaiki masalah ini?

Versi Spark: 1.6.1

Shuai Zhang
sumber
1
Bisakah Anda menempelkan perintah di sini yang Anda gunakan untuk mengirimkan skrip.
Shiv4nsh
Sudahkah Anda memberikan URL master percikan?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULHRESTY Ya.
Shuai Zhang
Saya mengalami ini di unit-test ( ) Sparkproyek saya . Dari jawaban @Dazzler , saya mengerti bahwa saya harus memindahkan -kreasi di dalam suite. Tapi juga hanya menyatakan s menjadi perbaiki itu (cinta !). Ini telah ditunjukkan oleh @gyuseong dalam jawabannya di bawah iniDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
y2k-shubham

Jawaban:

40

Di mana objek sparkContext didefinisikan, apakah itu di dalam fungsi utama?

Saya juga menghadapi masalah yang sama, kesalahan yang saya lakukan adalah saya memulai sparkContext di luar fungsi utama dan di dalam kelas.

Ketika saya memulainya di dalam fungsi utama, itu bekerja dengan baik.

Dazzler
sumber
11
Spark benar-benar perlu ditingkatkan: itu hanya menunjukkan pesan kesalahan yang sangat membingungkan dan tidak informatif ketika sesuatu yang salah terjadi
Shuai Zhang
3
Ini adalah solusi dan bukan solusi, Bagaimana jika saya ingin membuat Konteks Singletion dan membuat lapisan Konteks terpisah dari fungsi utama untuk beberapa aplikasi?
Murtaza Kanchwala
1
"Perhatikan bahwa aplikasi harus menentukan main()metode alih-alih memperluas scala.App. Subkelas dari scala.Appmungkin tidak bekerja dengan benar." Spark 2.1.0 Manual
ruhong
1
Perhatikan di mana Anda mencoba untuk getOrCreate()konteks harus dibuat di tingkat driver dan diteruskan ke tingkat pelaksana sesuai kebutuhan.
reim
139

TLDR:

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

daftar opsi untuk spark.master di spark 2.2.1

Saya berakhir di halaman ini setelah mencoba menjalankan program java Spark SQL sederhana dalam mode lokal. Untuk melakukan ini, saya menemukan bahwa saya dapat mengatur spark.master menggunakan:

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

Pembaruan untuk jawaban saya:

Untuk lebih jelasnya, ini bukan yang harus Anda lakukan dalam lingkungan produksi. Dalam lingkungan produksi, spark.master harus ditentukan di salah satu dari beberapa tempat lain: baik di $ SPARK_HOME / conf / spark-defaults.conf (di sinilah pengelola cloudera akan meletakkannya), atau di baris perintah saat Anda mengirimkan aplikasi. (misalnya percikan-kirim - benang master).

Jika Anda menetapkan spark.master menjadi 'lokal' dengan cara ini, spark akan mencoba berjalan dalam satu jvm, seperti yang ditunjukkan oleh komentar di bawah. Jika Anda kemudian mencoba menentukan --deploy-mode cluster, Anda akan mendapatkan pesan error 'Mode penerapan cluster tidak kompatibel dengan master "lokal"'. Ini karena pengaturan spark.master = local berarti Anda TIDAK menjalankan mode cluster.

Sebagai gantinya, untuk aplikasi produksi, dalam fungsi utama Anda (atau dalam fungsi yang dipanggil oleh fungsi utama Anda), Anda cukup menggunakan:

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

Ini akan menggunakan konfigurasi yang ditentukan pada baris perintah / dalam file konfigurasi.

Selain itu, untuk memperjelas hal ini juga: --master dan "spark.master" adalah parameter yang sama persis, hanya ditentukan dengan cara berbeda. Menetapkan kode spark.master, seperti dalam jawaban saya di atas, akan menimpa upaya untuk mengatur --master, dan akan menimpa nilai di spark-defaults.conf, jadi jangan lakukan itu dalam produksi. Ini bagus untuk tes.

juga, lihat jawaban ini . yang tertaut ke daftar opsi untuk spark.master dan apa yang sebenarnya dilakukan masing-masing opsi .

daftar opsi untuk spark.master di spark 2.2.1

Jack Davidson
sumber
5
ya, menambahkan ".config (" spark.master "," local ")" juga berhasil untuk saya.
Ashutosh S
Terima kasih ini berhasil untuk saya - tetapi dapatkah seseorang menjelaskan kepada seorang pemula (saya) apa yang dilakukan .config ("spark.master", "local")? Apakah kode saya masih baik-baik saja untuk dikompilasi ke dalam jar dan berjalan dalam produksi?
pengguna1761806
4
@ user1761806 sementara banyak jawaban melaporkan ini sebagai perbaikan, ini secara mendasar mengubah cara proses percikan, hanya menggunakan satu JVM. Lokal digunakan untuk pengujian lokal dan bukan solusi yang tepat untuk memperbaiki masalah ini jika Anda berniat untuk menyebarkan ke sebuah cluster. Saya memiliki masalah serupa dan jawaban yang diterima adalah solusi yang tepat untuk masalah saya.
Nathaniel Wendt
58

Bekerja untuk saya setelah mengganti

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

dengan

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

Menemukan solusi ini di beberapa utas lain di stackoverflow.

Sachin
sumber
1
Anda Pak, selamatkan hari saya ... Terima kasih!
Hako
3
Apakah ini menyelesaikan pertanyaan OP? Ini membuat cluster lokal di JVM ini, tidak melampirkan ke standalone di tempat lain.
Azeroth2b
Ini menyelesaikan masalah. Saya belum tahu (belum) tentang implikasi dari setMaster("local[2]")(alangkah baiknya memiliki penjelasan), tetapi jawaban ini dapat dianggap sebagai solusi untuk masalah tersebut.
Rick
Saya baru saja mengedit jawaban untuk memasukkan informasi ini :)
Rick
26

Nilai default "spark.master" adalah spark: // HOST: PORT, dan kode berikut mencoba untuk mendapatkan sesi dari kluster mandiri yang berjalan di HOST: PORT , dan mengharapkan nilai HOST: PORT ada di file konfigurasi percikan.

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

" org.apache.spark.SparkException: URL master harus disetel dalam konfigurasi Anda " menyatakan bahwa HOST: PORT tidak disetel di file konfigurasi spark.

Agar tidak peduli dengan nilai "HOST: PORT", setel spark.master sebagai lokal

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

Sini ini tautan untuk daftar format di mana URL master dapat diteruskan ke spark.master

Referensi: Tutorial Spark - Menyiapkan Ekosistem Spark

Mallikarjun M
sumber
Terima kasih banyak, Anda telah menyelamatkan hari saya!
GentleCoder
7

cukup tambahkan .setMaster("local")ke kode Anda seperti yang ditunjukkan di bawah ini:

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

Itu berhasil untuk saya! Selamat membuat kode!

kumar sanu
sumber
6

Jika Anda menjalankan aplikasi mandiri maka Anda harus menggunakan SparkContextbukannyaSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
sumber
5
.setMaster("local")adalah kunci untuk memecahkan masalah bagi saya
tom10271
Bagaimana jika saya telah menyetelnya tetapi masih mengalami kesalahan ini? @ tom10271
Anna Leonenko
@AnnaLeonenko Saya minta maaf tetapi saya telah berhenti mengembangkan aplikasi Spark selama setahun, saya tidak dapat mengingat ingatan saya. Tapi saya kira master node Anda bukan lokal yang dikelola oleh percikan tapi benang?
tom10271
1
@AnnaLeonenko Saya telah memeriksa pengaturan saya. Ketika saya menjalankannya secara lokal untuk pengembangan dan saya hanya menggunakan Spark untuk mengelola node master, maka saya akan mengaturnya ke localatau local[*]. Saat saya menerapkannya ke AWS EMR, ia menggunakan Yarn untuk koordinasi, lalu saya menetapkan master sebagaiyarn
tom10271
3

Bagaimana konteks percikan dalam aplikasi Anda memilih nilai untuk master percikan?

  • Anda juga memberikannya secara eksplisit SparkConfsaat membuat SC.
  • Atau mengambil dari System.getProperties(di mana SparkSubmit sebelumnya meletakkannya setelah membaca --masterargumen Anda ).

Sekarang, SparkSubmitjalankan driver - yang dalam kasus Anda adalah mesin tempat Anda menjalankan filespark-submit skrip. Dan ini mungkin berfungsi seperti yang diharapkan untuk Anda juga.

Namun, dari informasi yang Anda posting sepertinya Anda sedang membuat konteks percikan dalam kode yang dikirim ke pelaksana - dan mengingat bahwa tidak ada spark.master properti sistem yang tersedia di sana, gagal. (Dan Anda seharusnya tidak melakukannya, jika ini masalahnya.)

Bisakah Anda memposting GroupEvolutionESkode (khususnya di tempat Anda membuat SparkContext(s)).

Sachin Tyagi
sumber
1
Iya. Saya seharusnya membuat SparkContext dalam mainfungsi GroupEvolutionES (yang tidak saya lakukan).
Shuai Zhang
1
Ini adalah solusi dan bukan solusi, Bagaimana jika saya ingin membuat Konteks Singletion dan membuat lapisan Konteks terpisah dari fungsi utama untuk beberapa aplikasi? Ada komentar tentang bagaimana saya bisa mencapainya?
Murtaza Kanchwala
2

Mengganti:

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

Melakukan keajaiban.

Nazima
sumber
5
Bukankah solusi Anda sama persis dengan apa yang diposting @Sachin?
Akavall
mengapa penduduk setempat [2] dapatkah Anda menjelaskan
SUDARSHAN
tentang lokal [2] -> stackoverflow.com/questions/32356143/…
raevilman
2

Saya memiliki masalah yang sama, Ini kode saya sebelum modifikasi:

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

}

Dan setelah mengganti:

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

Dengan:

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

Ini bekerja dengan baik!


sumber
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
sumber
Solusi inilah yang berhasil untuk saya. Terima kasih telah memasangnya. @Tokopedia
Siwoku Adeola
2

coba ini

membuat sifat

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

memperpanjangnya

object Preprocess extends SparkSessionWrapper {
gyuseong
sumber
1

Kami kehilangan setMaster ("local [*]") untuk disetel. Setelah kami menambahkan maka masalah teratasi.

Masalah:

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

larutan:

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

Jika Anda menggunakan kode berikut

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

Kemudian ganti dengan baris berikut

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

Di Spark 2.0 Anda dapat menggunakan kode berikut

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

Anda perlu menambahkan .master ("local [*]") jika menjalankan local di sini * berarti semua node, Anda dapat mengatakan insted 8 1,2 dll

Anda perlu mengatur URL Master jika di cluster

vaquar khan
sumber
0

Jika Anda tidak menyediakan konfigurasi Spark di JavaSparkContext maka Anda mendapatkan kesalahan ini. Yaitu: JavaSparkContext sc = new JavaSparkContext ();

Solusi: Sediakan JavaSparkContext sc = new JavaSparkContext (conf);

Rimi Gandhi
sumber
0

Mencoba opsi ini dalam mempelajari pemrosesan Spark dengan menyiapkan konteks Spark di mesin lokal. Persyaratan 1) Biarkan sesi Spark berjalan di lokal 2) Tambahkan ketergantungan Spark maven 3) Simpan file input di root \ folder input 4) output akan ditempatkan di folder \ output. Mendapatkan nilai saham maksimal selama setahun. unduh CSV apa pun dari yahoo finance https://in.finance.yahoo.com/quote/CAPPL.BO/history/ Maven dependency dan kode Scala di bawah -

<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
sumber
0

Saya menggunakan konstruktor SparkContext ini, dan kesalahan hilang:

val sc = new SparkContext("local[*]", "MyApp")
remondo
sumber