Spark - Lỗi “URL chính phải được đặt trong cấu hình của bạn” khi gửi ứng dụng


93

Tôi có một ứng dụng Spark chạy không có vấn đề gì ở chế độ cục bộ, nhưng gặp một số vấn đề khi gửi đến cụm Spark.

Thông báo lỗi như sau:

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)

Trong đoạn mã trên, GroupEvolutionESlà lớp chính. Thông báo lỗi cho biết "URL chính phải được đặt trong cấu hình của bạn", nhưng tôi đã cung cấp thông số "--master" cho spark-submit.

Bất cứ ai biết làm thế nào để khắc phục sự cố này?

Phiên bản Spark: 1.6.1


1
Bạn có thể vui lòng dán vào đây lệnh mà bạn đang sử dụng để gửi tập lệnh.
Shiv4nsh

Bạn đã cung cấp URL chính của spark chưa?
Kshitij Kulshrestha

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

@KSHITIJKULSHRESTHA Có.
Shuai Zhang

Tôi gặp phải điều này trong các bài kiểm tra đơn vịSpark của dự án của tôi ( ). Từ câu trả lời của @Dazzler , tôi hiểu rằng tôi phải di chuyển- tạo ra bên trong các dãy phòng. Nhưng cũng chỉ cần khai báo s để sửa chữa nó (tình yêu !). Đã được chỉ ra này được @gyuseong trong câu trả lời của ông dưới đâyDataFrameSuiteBaseDataFrametest(..) { .. }DataFramelazyScala
Y2K-Shubham

Câu trả lời:


40

Đối tượng sparkContext được định nghĩa ở đâu, nó có bên trong hàm chính không?

Tôi cũng gặp phải vấn đề tương tự, lỗi mà tôi đã làm là tôi đã khởi tạo sparkContext bên ngoài hàm chính và bên trong lớp.

Khi tôi khởi tạo nó bên trong hàm chính, nó hoạt động tốt.


11
Spark thực sự cần phải cải thiện: nó chỉ hiển thị rất khó hiểu và thông báo lỗi không đủ thông tin khi happends gì sai
Shuai Zhang

3
Đây là một cách giải quyết chứ không phải là một giải pháp, Điều gì sẽ xảy ra nếu tôi muốn tạo Ngữ cảnh đơn và tạo một lớp Ngữ cảnh riêng biệt ngoài chức năng chính cho nhiều ứng dụng?
Murtaza Kanchwala

1
"Lưu ý rằng các ứng dụng nên xác định một main()phương thức thay vì mở rộng scala.App. Các lớp con của scala.Appcó thể không hoạt động chính xác." Spark 2.1.0 Hướng dẫn sử dụng
ruhong

Hãy chú ý đến nơi bạn cố gắng getOrCreate()một ngữ cảnh nên được tạo ở cấp trình điều khiển và chuyển cho cấp thực thi khi cần thiết.
reim 20/02/18

131

TLDR:

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

danh sách các tùy chọn cho spark.master trong spark 2.2.1

Tôi đã kết thúc trên trang này sau khi cố gắng chạy một chương trình java Spark SQL đơn giản ở chế độ cục bộ. Để làm điều này, tôi thấy rằng tôi có thể đặt spark.master bằng cách sử dụng:

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

Cập nhật câu trả lời của tôi:

Nói rõ hơn, đây không phải là điều bạn nên làm trong môi trường sản xuất. Trong môi trường sản xuất, spark.master nên được chỉ định ở một trong một số nơi khác: trong $ SPARK_HOME / conf / spark-defaults.conf (đây là nơi trình quản lý cloudera sẽ đặt nó) hoặc trên dòng lệnh khi bạn gửi ứng dụng. (ex spark-submit - sợi chủ).

Nếu bạn chỉ định spark.master là 'cục bộ' theo cách này, spark sẽ cố gắng chạy trong một jvm duy nhất, như được chỉ ra bởi các nhận xét bên dưới. Nếu sau đó bạn cố gắng chỉ định cụm chế độ --deploy-mode, bạn sẽ gặp lỗi 'Chế độ triển khai cụm không tương thích với "cục bộ" chính' '. Điều này là do cài đặt spark.master = local có nghĩa là bạn KHÔNG chạy ở chế độ cụm.

Thay vào đó, đối với một ứng dụng sản xuất, trong chức năng chính của bạn (hoặc trong các chức năng được gọi bởi chức năng chính của bạn), bạn chỉ cần sử dụng:

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

Điều này sẽ sử dụng các cấu hình được chỉ định trên dòng lệnh / trong tệp cấu hình.

Ngoài ra, cũng cần phải làm rõ điều này: --master và "spark.master" là cùng một tham số chính xác, chỉ được chỉ định theo những cách khác nhau. Đặt spark.master trong mã, giống như trong câu trả lời của tôi ở trên, sẽ ghi đè các nỗ lực đặt --master và sẽ ghi đè các giá trị trong spark-defaults.conf, vì vậy đừng làm điều đó trong sản xuất. Nó tuyệt vời cho các bài kiểm tra mặc dù.

ngoài ra, hãy xem câu trả lời này . liên kết đến danh sách các tùy chọn cho spark.master và những gì mỗi tùy chọn thực sự làm.

danh sách các tùy chọn cho spark.master trong spark 2.2.1


5
vâng, thêm ".config (" spark.master "," local ")" cũng làm việc cho tôi.
Ashutosh S

Cảm ơn điều này đã làm việc cho tôi - nhưng ai đó có thể giải thích cho một người mới (tôi) những gì .config ("spark.master", "local") đang làm không? Mã của tôi sẽ vẫn ổn để biên dịch thành một jar và chạy trong sản xuất chứ?
user1761806

4
@ user1761806 trong khi nhiều câu trả lời báo cáo đây là một bản sửa lỗi, nó thay đổi cơ bản cách xử lý tia lửa, chỉ sử dụng một JVM duy nhất. Local được sử dụng để thử nghiệm cục bộ và không phải là giải pháp chính xác để khắc phục sự cố này nếu bạn có ý định triển khai thành một cụm. Tôi đã gặp vấn đề tương tự và câu trả lời được chấp nhận là giải pháp chính xác cho vấn đề của tôi.
Nathaniel Wendt

58

Làm việc cho tôi sau khi thay thế

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

với

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

Đã tìm thấy giải pháp này trên một số luồng khác trên stackoverflow.


1
Bạn Sir, đã cứu ngày của tôi ... Cảm ơn bạn!
Hako

3
Điều này có giải quyết được câu hỏi của OP không? Điều này tạo ra một cụm cục bộ trong JVM này, không gắn vào một cụm độc lập ở nơi khác.
Azeroth2b

Điều này giải quyết vấn đề. Tôi không biết (chưa) về ý nghĩa của setMaster("local[2]")(rất vui nếu có lời giải thích), nhưng câu trả lời này có thể được coi là giải pháp cho vấn đề.
Rick

Tôi vừa chỉnh sửa câu trả lời để bao gồm thông tin này :)
Rick

26

Giá trị mặc định của "spark.master" là spark: // HOST: PORT và mã sau cố gắng lấy một phiên từ cụm độc lập đang chạy tại HOST: PORT và mong đợi giá trị HOST: PORT nằm trong tệp cấu hình spark.

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

" org.apache.spark.SparkException: URL chính phải được đặt trong cấu hình của bạn " cho biết rằng HOST: PORT không được đặt trong tệp cấu hình tia lửa.

Để không bận tâm về giá trị của "HOST: PORT", hãy đặt spark.master làm cục bộ

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

Đây là liên kết cho danh sách các định dạng mà URL chính có thể được chuyển đến spark.master

Tham khảo: Spark Tutorial - Setup Spark Ecosystem


Cảm ơn bạn rất nhiều bạn đã cứu ngày của tôi!
GentleCoder

6

Nếu bạn đang chạy một ứng dụng độc lập thì bạn phải sử dụng SparkContextthay vìSparkSession

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

5
.setMaster("local")là chìa khóa để giải quyết vấn đề đối với tôi
tom10271

Điều gì sẽ xảy ra nếu tôi đã đặt nó nhưng vẫn bị lỗi này? @ tom10271
Anna Leonenko

@AnnaLeonenko Tôi xin lỗi nhưng tôi đã ngừng phát triển ứng dụng Spark được một năm rồi, tôi không thể nhớ lại trí nhớ của mình. Nhưng tôi đoán rằng nút chính của bạn không phải là nút cục bộ được quản lý bởi tia lửa mà là sợi?
tom10271

1
@AnnaLeonenko Tôi đã kiểm tra cài đặt của mình. Khi tôi đang chạy nó cục bộ để phát triển và tôi chỉ sử dụng Spark để quản lý nút chính, thì tôi sẽ đặt nó thành localhoặc local[*]. Khi tôi triển khai nó lên AWS EMR, nó sử dụng Yarn để điều phối, sau đó tôi đặt chính làyarn
tom10271

6

chỉ cần thêm .setMaster("local")vào mã của bạn như được hiển thị bên dưới:

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

Nó đã làm việc cho tôi! Chúc bạn viết mã vui vẻ!


3

Làm cách nào để ngữ cảnh spark trong ứng dụng của bạn chọn giá trị cho spark master?

  • Bạn có thể cung cấp cho nó một cách dễ dàng trong SparkConfkhi tạo SC.
  • Hoặc nó chọn từ System.getProperties(nơi SparkSubmit trước đó đã đặt nó sau khi đọc --masterlập luận của bạn ).

Bây giờ, SparkSubmitchạy trên trình điều khiển - trong trường hợp của bạn là máy từ nơi bạn đang thực thi spark-submittập lệnh. Và điều này có lẽ cũng đang hoạt động như mong đợi đối với bạn.

Tuy nhiên, từ thông tin bạn đã đăng, có vẻ như bạn đang tạo bối cảnh tia lửa trong mã được gửi đến trình thực thi - và cho rằng không có spark.master hệ thống ở đó, nên nó không thành công. (Và bạn thực sự không nên làm như vậy, nếu đây là trường hợp.)

Bạn có thể vui lòng đăng GroupEvolutionESmã (cụ thể là nơi bạn đang tạo SparkContext(s)).


1
Đúng. Tôi lẽ ra đã tạo SparkContext trong các mainchức năng của GroupEvolutionES (mà tôi đã không).
Shuai Zhang

1
Đây là một cách giải quyết chứ không phải là một giải pháp, Điều gì sẽ xảy ra nếu tôi muốn tạo Ngữ cảnh đơn và tạo một lớp Ngữ cảnh riêng biệt ngoài chức năng chính cho nhiều ứng dụng? Bất kỳ nhận xét về cách tôi có thể đạt được nó?
Murtaza Kanchwala

2

Thay thế:

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

Đã làm điều kỳ diệu.


5
Không phải giải pháp của bạn hoàn toàn giống với những gì @Sachin đã đăng?
Akavall

tại sao địa phương [2] bạn có thể giải thích
SUDARSHAN


2

Tôi đã gặp vấn đề tương tự, Đây là mã của tôi trước khi sửa đổi:

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

}

Và sau khi thay thế:

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

Với :

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

Nó hoạt động tố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")

Giải pháp này là những gì đã làm việc cho tôi. Cảm ơn đã đăng nó lên. @Mario.
Siwoku Adeola

2

thử cái này

làm cho đặc điểm

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

mở rộng nó

object Preprocess extends SparkSessionWrapper {

1

Chúng tôi thiếu setMaster ("local [*]") để đặt. Sau khi chúng tôi thêm vào thì vấn đề được giải quyết.

Vấn đề:

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

giải pháp:

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

0

Nếu bạn đang sử dụng mã sau

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

Sau đó thay thế bằng các dòng sau

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

Trong Spark 2.0, bạn có thể sử dụng mã sau

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

Bạn cần thêm .master ("local [*]") nếu chạy cục bộ ở đây * có nghĩa là tất cả các nút, bạn có thể nói thêm 8 1,2, v.v.

Bạn cần đặt URL chính nếu trên cụm


0

Nếu bạn không cung cấp cấu hình Spark trong JavaSparkContext thì bạn sẽ gặp lỗi này. Đó là: JavaSparkContext sc = new JavaSparkContext ();

Giải pháp: Cung cấp JavaSparkContext sc = new JavaSparkContext (conf);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.