Spark-앱을 제출할 때 "구성에 마스터 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을 제공 했습니까?
Kshitij Kulshrestha

@ShivanshSrivastava 스파크 --master --class GroupEvolutionES을 스파크 제출 : // 클러스터 노드 NN1 : 7077 --jars $ MYPATH myapp.jar
슈 아이 장

@KSHITIJKULSHRESTHA 네.
Shuai Zhang

Spark프로젝트의 단위 테스트 ( DataFrameSuiteBase) 에서 이것을 만났습니다 . 에서 @Dazzler 의 대답은, 내가 이동해야한다는 것을 이해 DataFrame-creation 내부의 test(..) { .. }스위트 룸. 그러나 s를 선언 DataFrame하면 문제가lazy 해결됩니다 (love Scala!). 이되었습니다 지적 아웃 될 @gyuseong그의 대답 아래
Y2K-하기 Shubham

답변:


40

sparkContext 객체는 어디에 정의되어 있습니까? 주 함수 안에 있습니까?

저도 같은 문제에 직면했습니다. 제가 한 실수는 주 함수 외부와 클래스 내부에서 sparkContext를 시작하는 것입니다.

주 기능 내에서 시작했을 때 제대로 작동했습니다.


11
스파크는 정말 개선해야합니다 : 그것은 단지 쇼 매우 혼란스럽고 가치가없는 오류 메시지 때 뭔가 잘못의 happends
슈 아이 장

3
이것은 해결책이 아니라 해결 방법입니다. Singletion Context를 생성하고 여러 애플리케이션의 주요 기능과 별도로 별도의 Context 레이어를 생성하려면 어떻게해야합니까?
Murtaza Kanchwala

1
"응용 프로그램은 main()확장하는 대신 메서드를 정의해야합니다 scala.App.의 하위 클래스가 scala.App제대로 작동하지 않을 수 있습니다." 스파크 2.1.0 수동
ruhong

getOrCreate()드라이버 수준에서 컨텍스트를 생성하고 필요에 따라 실행자 수준으로 전달해야하는 위치에주의하십시오 .
reim

131

TLDR :

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

spark 2.2.1의 spark.master 옵션 목록

로컬 모드에서 간단한 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 관리자가 배치 할 위치) 또는 제출시 명령 줄 중 하나에 지정되어야합니다. 앱. (ex spark-submit --master yarn).

이런 방식으로 spark.master를 '로컬'로 지정하면 아래 설명에 표시된 것처럼 spark는 단일 jvm에서 실행을 시도합니다. 그런 다음 --deploy-mode 클러스터를 지정하려고하면 '클러스터 배포 모드가 마스터 "로컬"과 호환되지 않음'오류가 표시됩니다. 이는 spark.master = local을 설정하면 클러스터 모드에서 실행되고 있지 않음을 의미하기 때문입니다.

대신 프로덕션 앱의 경우 주 함수 (또는 주 함수에서 호출하는 함수) 내에서 다음을 사용하면됩니다.

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

이것은 명령 줄 / 구성 파일에 지정된 구성을 사용합니다.

또한 이것에 대해서도 명확히하기 위해 : --master 및 "spark.master"는 정확히 동일한 매개 변수이며 다른 방식으로 지정됩니다. 위의 답변에서와 같이 코드에서 spark.master를 설정하면 --master 설정 시도가 무시되고 spark-defaults.conf의 값이 무시되므로 프로덕션에서는 수행하지 마십시오. 그래도 테스트에 적합합니다.

또한 이 답변을 참조하십시오 . spark.master에 대한 옵션 목록과 각 옵션이 실제로 수행하는 작업에 대한 링크 입니다.

spark 2.2.1의 spark.master 옵션 목록


5
예, ".config ("spark.master ","local ")"추가도 저에게 효과적이었습니다.
Ashutosh S

이것이 저에게 효과적이었습니다.하지만 누군가가 .config ( "spark.master", "local")이하는 일을 초보자 (나)에게 설명 할 수 있습니까? 내 코드를 jar로 컴파일하고 프로덕션에서 실행해도 괜찮습니까?
user1761806

4
@ user1761806 많은 답변이 이것을 수정 사항으로보고하지만 단일 JVM 만 사용하여 스파크 프로세스 방식을 근본적으로 변경합니다. 로컬은 로컬 테스트에 사용되며 클러스터에 배포하려는 경우이 문제를 해결하기위한 올바른 솔루션이 아닙니다. 나는 비슷한 문제가 있었고 받아 들여진 대답은 내 문제에 대한 올바른 해결책이었습니다.
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]")설명이 있으면 좋을 것 입니다)의 의미에 대해 (아직) 모르지만이 답변은 문제에 대한 해결책으로 간주 될 수 있습니다.

난 그냥이 정보 :) 포함 대답을 편집

26

"spark.master"의 기본값은 spark : // HOST : PORT이며 다음 코드는 HOST : PORT 에서 실행중인 독립 실행 형 클러스터에서 세션을 가져 오려고 시도 하고 HOST : PORT 값이 스파크 구성 파일.

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

" org.apache.spark.SparkException : 구성에 마스터 URL을 설정해야합니다. "는 HOST : PORT 가 스파크 구성 파일에 설정되어 있지 않음을 나타냅니다.

"HOST : PORT"의 값을 신경 쓰지 않으려면 spark.master로컬 로 설정 하십시오.

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

다음 은 마스터 URL을 spark.master에 전달할 수있는 형식 목록에 대한 링크입니다.

참조 : Spark Tutorial - Setup Spark Ecosystem


내 하루를 구 해주셔서 감사합니다!
GentleCoder

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 미안하지만 이미 1 년 동안 Spark 애플리케이션 개발을 중단했는데 기억이 나지 않습니다. 하지만 마스터 노드가 스파크가 아닌 원사로 관리되는 로컬 노드가 아닌 것 같습니다.
tom10271

1
@AnnaLeonenko 내 설정을 확인했습니다. 개발을 위해 로컬로 실행하고 Spark 만 마스터 노드를 관리 할 때 local또는로 설정합니다 local[*]. AWS EMR에 배포 할 때 조정을 위해 Yarn을 사용하고 마스터를 다음과 같이 설정합니다.yarn
tom10271

6

.setMaster("local")아래와 같이 코드에 추가 하십시오.

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

그것은 나를 위해 일했습니다! 행복한 코딩!


3

애플리케이션의 스파크 컨텍스트는 스파크 마스터의 값을 어떻게 선택합니까?

  • SparkConfSC를 생성 하는 동안 명시 적으로 제공합니다 .
  • 또는 System.getProperties(SparkSubmit이 이전에 --master인수를 읽은 후 넣은 곳 )에서 선택합니다.

이제 SparkSubmit드라이버 에서 실행됩니다. 귀하의 경우에는 spark-submit스크립트를 실행하는 컴퓨터입니다 . 그리고 이것은 아마도 당신에게도 예상대로 작동 할 것입니다.

그러나 게시 한 정보를 보면 실행자에게 전송되는 코드에서 스파크 컨텍스트를 만드는 것처럼 보이며 여기에 spark.master사용할 수있는 시스템 속성 이 없으면 실패합니다. (그렇다면 실제로 그렇게해서는 안됩니다.)

GroupEvolutionES코드 (특히 생성중인 위치) 를 게시 해 주시겠습니까 SparkContext(s)?


1
예. GroupEvolutionES의 main기능 에서 SparkContext를 만들었어야합니다 .
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


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

이 솔루션이 저에게 효과적이었습니다. 올려 주셔서 감사합니다. @Mario.
Siwoku Adeola

2

이 시도

특성을 만들다

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

그것을 확장

object Preprocess extends SparkSessionWrapper {

1

우리는 누락 setMaster ( "[*] 지역") 세트를. 추가하면 문제가 해결됩니다.

문제:

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

여기서 local을 실행하면 * 모든 노드를 의미하는 경우 .master ( "local [*]")를 추가해야합니다. 8 1,2 등의 insted라고 말할 수 있습니다.

클러스터에있는 경우 마스터 URL을 설정해야합니다.


0

JavaSparkContext에서 Spark 구성을 제공하지 않으면이 오류가 발생합니다. 즉, JavaSparkContext sc = new JavaSparkContext ();

솔루션 : JavaSparkContext 제공 sc = new JavaSparkContext (conf);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.