จุดประกาย - ข้อผิดพลาด“ ต้องตั้งค่า URL หลักในการกำหนดค่าของคุณ” เมื่อส่งแอป


93

ฉันมีแอป 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


1
คุณช่วยวางคำสั่งที่นี่ที่คุณใช้ส่งสคริปต์ได้ไหม
Shiv4nsh

คุณได้ระบุ URL หลักของ spark หรือไม่?
Kshitij Kulshrestha

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

@KSHITIJKULSHRESTHA ครับ
Shuai Zhang

ฉันพบสิ่งนี้ในการทดสอบหน่วย ( ) ของSparkโครงการของฉัน จากคำตอบของ@Dazzlerฉันเข้าใจว่าต้องย้าย - สร้างภายในห้องชุด แต่ยังเพิ่งประกาศว่าจะแก้ไข (รัก!) นี้ได้รับการชี้ให้เห็นเป็น@gyuseongในคำตอบของเขาด้านล่างDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
Y2K-shubham

คำตอบ:


40

วัตถุ sparkContext ถูกกำหนดไว้ที่ใดอยู่ภายในฟังก์ชันหลักหรือไม่

ฉันก็ประสบปัญหาเดียวกันเช่นกันความผิดพลาดที่ฉันทำคือฉันเริ่มต้น sparkContext นอกฟังก์ชันหลักและภายในคลาส

เมื่อฉันเริ่มต้นภายในฟังก์ชั่นหลักมันก็ทำงานได้ดี


11
Spark จำเป็นต้องปรับปรุงจริงๆ: มันแสดงข้อความแสดงข้อผิดพลาดที่สับสนและไม่เป็นข้อมูลเมื่อมีสิ่งผิดปกติเกิดขึ้น
Shuai Zhang

3
นี่เป็นวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหาจะเกิดอะไรขึ้นถ้าฉันต้องการสร้าง Singletion Context และสร้างเลเยอร์บริบทแยกต่างหากจากฟังก์ชันหลักสำหรับแอปพลิเคชันหลายรายการ
Murtaza Kanchwala

1
"โปรดทราบว่าแอปพลิเคชันควรกำหนดmain()วิธีการแทนการขยายscala.Appคลาสย่อยscala.Appอาจทำงานไม่ถูกต้อง" Spark 2.1.0 Manual
ruhong

1
ให้ความสนใจกับตำแหน่งที่คุณพยายามgetOrCreate()สร้างบริบทที่ระดับไดรเวอร์และส่งต่อไปยังระดับผู้ปฏิบัติการตามความจำเป็น
reim

139

TLDR:

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

รายการตัวเลือกสำหรับ spark.master ใน spark 2.2.1

ฉันจบลงในหน้านี้หลังจากพยายามเรียกใช้โปรแกรม Spark SQL java แบบธรรมดาในโหมดโลคัล ในการทำเช่นนี้ฉันพบว่าฉันสามารถตั้ง 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 จะวางไว้) หรือในบรรทัดคำสั่งเมื่อคุณส่ง แอป (เช่น spark-submit --master yarn)

หากคุณระบุ spark.master เป็น 'local' ด้วยวิธีนี้ spark จะพยายามรันใน jvm เดียวตามที่ระบุไว้ในความคิดเห็นด้านล่าง หากคุณพยายามระบุ --deploy-mode คลัสเตอร์คุณจะได้รับข้อผิดพลาด 'Cluster deploy mode is not compatible with master "local"' เนื่องจากการตั้งค่า 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


5
ใช่การเพิ่ม ".config (" spark.master "," local ")" ก็ใช้ได้เช่นกัน
Ashutosh S

ขอบคุณสิ่งนี้ได้ผลสำหรับฉัน - แต่จะมีใครอธิบายให้มือใหม่ (ฉัน) ฟังได้ไหมว่า. config ("spark.master", "local") กำลังทำอะไรอยู่ รหัสของฉันจะยังคงสามารถรวบรวมลงใน jar และทำงานในการผลิตได้หรือไม่
user1761806

4
@ user1761806 ในขณะที่คำตอบจำนวนมากรายงานว่าเป็นการแก้ไข แต่โดยพื้นฐานแล้วจะเปลี่ยนวิธีการจุดประกายโดยใช้ JVM เดียวเท่านั้น Local ใช้สำหรับการทดสอบภายในเครื่องและไม่ใช่วิธีแก้ปัญหาที่ถูกต้องในการแก้ไขปัญหานี้หากคุณต้องการปรับใช้กับคลัสเตอร์ ฉันมีปัญหาที่คล้ายกันและคำตอบที่ยอมรับคือวิธีแก้ปัญหาของฉันที่ถูกต้อง
Nathaniel Wendt

58

ทำงานให้ฉันหลังจากเปลี่ยน

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


1
คุณเซอร์ช่วยวันของฉัน ... ขอบคุณ!
Hako

3
สิ่งนี้ช่วยแก้ปัญหาของ OP หรือไม่? สิ่งนี้จะสร้างคลัสเตอร์โลคัลใน JVM นี้ไม่ได้แนบไปกับสแตนด์อโลนที่อื่น
Azeroth2b

วิธีนี้ช่วยแก้ปัญหาได้ ฉันไม่รู้ (ยัง) เกี่ยวกับผลกระทบของsetMaster("local[2]")(จะดีถ้ามีคำอธิบาย) แต่คำตอบนี้ถือได้ว่าเป็นทางออกสำหรับปัญหานี้
Rick

ฉันเพิ่งแก้ไขคำตอบเพื่อรวมข้อมูลนี้ :)
Rick

26

ค่าดีฟอลต์ของ "spark.master" คือ spark: // HOST: PORT และโค้ดต่อไปนี้จะพยายามรับเซสชันจากคลัสเตอร์แบบสแตนด์อโลนที่รันที่HOST: PORTและคาดว่าค่า HOST: PORT จะอยู่ใน ไฟล์ config spark

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

" org.apache.spark.SparkException: ต้องตั้งค่า URL หลักในการกำหนดค่าของคุณ " ระบุว่าไม่ได้ตั้งค่าHOST: PORTในไฟล์คอนฟิกูเรชัน spark

เพื่อไม่ต้องกังวลเกี่ยวกับค่าของ "HOST: PORT" ให้ตั้งspark.masterเป็นlocal

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

นี่คือลิงค์สำหรับรายการรูปแบบที่สามารถส่งผ่าน URL หลักไปยัง spark.master

ข้อมูลอ้างอิง: Spark Tutorial - ตั้งค่า Spark Ecosystem


ขอบคุณมากที่ช่วยวันของฉัน!
GentleCoder

7

เพียงแค่เพิ่ม.setMaster("local")รหัสของคุณตามที่แสดงด้านล่าง:

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

มันได้ผลสำหรับฉัน! ขอให้สนุกกับการเขียนโค้ด!


6

หากคุณใช้งานแอปพลิเคชันแบบสแตนด์อโลนคุณต้องใช้SparkContextแทนไฟล์SparkSession

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

5
.setMaster("local")เป็นกุญแจสำคัญในการแก้ปัญหาสำหรับฉัน
tom10271

จะเกิดอะไรขึ้นถ้าฉันตั้งค่าไว้ แต่ยังมีข้อผิดพลาดนี้ @ tom10271
Anna Leonenko

@AnnaLeonenko ฉันขอโทษ แต่ฉันหยุดพัฒนาแอพพลิเคชั่น Spark ไปหนึ่งปีแล้วฉันจำความทรงจำไม่ได้ แต่ฉันเดาว่าโหนดหลักของคุณไม่ได้อยู่ในพื้นที่ซึ่งจัดการโดยประกายไฟ แต่เป็นเส้นด้าย?
tom10271

1
@AnnaLeonenko ฉันตรวจสอบการตั้งค่าของฉันแล้ว เมื่อฉันได้ใช้มันในประเทศสำหรับการพัฒนาและฉันเท่านั้นที่ใช้จุดประกายในการจัดการโหนดหลักแล้วฉันจะตั้งค่าให้หรือlocal local[*]เมื่อฉันปรับใช้กับ AWS EMR มันใช้ Yarn สำหรับการประสานงานจากนั้นฉันตั้งค่าหลักเป็นyarn
tom10271

3

บริบทจุดประกายในแอปพลิเคชันของคุณเลือกค่าสำหรับ spark master อย่างไร

  • คุณต้องระบุอย่างชัดเจนด้วยSparkConfการสร้าง SC
  • หรือเลือกจากSystem.getProperties(ที่ SparkSubmit วางไว้ก่อนหน้านี้หลังจากอ่าน--masterอาร์กิวเมนต์ของคุณ)

ตอนนี้SparkSubmitรันบนไดรเวอร์ - ซึ่งในกรณีของคุณคือเครื่องที่คุณเรียกใช้spark-submitสคริปต์ และนี่อาจทำงานได้ตามที่คุณคาดไว้เช่นกัน

อย่างไรก็ตามจากข้อมูลที่คุณโพสต์ดูเหมือนว่าคุณกำลังสร้างบริบทจุดประกายในโค้ดที่ส่งไปยังตัวดำเนินการ - และเนื่องจากไม่มีspark.masterคุณสมบัติของระบบที่นั่นจึงล้มเหลว (และคุณไม่ควรทำเช่นนั้นจริงๆหากเป็นกรณีนี้)

กรุณาโพสต์GroupEvolutionESรหัส (เฉพาะที่ที่คุณสร้างSparkContext(s))


1
ใช่. ฉันควรสร้าง SparkContext ในmainฟังก์ชั่นของ GroupEvolutionES (ซึ่งฉันไม่ได้ทำ)
Shuai Zhang

1
นี่เป็นวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหาจะเกิดอะไรขึ้นถ้าฉันต้องการสร้าง Singletion Context และสร้างเลเยอร์บริบทแยกต่างหากจากฟังก์ชันหลักสำหรับแอปพลิเคชันหลายรายการ ความคิดเห็นใด ๆ เกี่ยวกับวิธีที่ฉันจะบรรลุ?
Murtaza Kanchwala

2

การเปลี่ยน:

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

ทำเวทมนตร์


5
วิธีแก้ปัญหาของคุณไม่เหมือนกับที่ @Sachin โพสต์ไว้ใช่หรือไม่?
Akavall

ทำไมคนในท้องถิ่น [2] คุณสามารถอธิบายได้
SUDARSHAN

เกี่ยวกับ local [2] -> stackoverflow.com/questions/32356143/…
raevilman

2

ฉันมีปัญหาเดียวกันนี่คือรหัสของฉันก่อนแก้ไข:

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[*]")

มันทำงานได้ดี!


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

วิธีแก้ปัญหานี้เป็นสิ่งที่ได้ผลสำหรับฉัน ขอขอบคุณที่แจ้งให้ทราบ @ มาริโอ้.
Siwoku Adeola

2

ลองดู

สร้างลักษณะ

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

ขยายมัน

object Preprocess extends SparkSessionWrapper {

1

เราไม่มี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()

0

หากคุณใช้รหัสต่อไปนี้

 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 เป็นต้น

คุณต้องตั้งค่า Master URL หากอยู่ในคลัสเตอร์


0

หากคุณไม่ได้ระบุคอนฟิกูเรชัน Spark ใน JavaSparkContext คุณจะได้รับข้อผิดพลาดนี้ นั่นคือ: JavaSparkContext sc = JavaSparkContext ใหม่ ();

วิธีแก้ไข: จัดเตรียม JavaSparkContext sc = new JavaSparkContext (conf);


0

ลองใช้ตัวเลือกนี้ในการเรียนรู้การประมวลผล Spark ด้วยการตั้งค่าบริบท Spark ในเครื่องท้องถิ่น Requisite 1) ให้ Spark sessionr ทำงานในโลคัล 2) เพิ่ม Spark maven dependency 3) เก็บไฟล์อินพุตไว้ที่ root \ input folder 4) เอาต์พุตจะถูกวางไว้ที่โฟลเดอร์ \ output รับมูลค่าหุ้นสูงสุดสำหรับปี โหลด CSV ใด ๆ จาก yahoo finance https://in.finance.yahoo.com/quote/CAPPL.BO/history/ Maven dependency และรหัส 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)
  }

0

ฉันใช้ตัวสร้าง SparkContext แทนและข้อผิดพลาดหายไป:

val sc = new SparkContext("local[*]", "MyApp")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.