[scala] Spark-앱을 제출할 때 “구성에 마스터 URL을 설정해야합니다”오류

로컬 모드에서 문제없이 실행되는 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



답변

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

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

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


답변

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 옵션 목록


답변

교체 후 나를 위해 일했습니다.

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의 다른 스레드에서이 솔루션을 찾았습니다.


답변

“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 TutorialSetup Spark Ecosystem


답변

독립 실행 형 응용 프로그램을 실행하는 경우 SparkContext대신 다음을 사용해야 합니다.SparkSession

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


답변

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

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

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


답변

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

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

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

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

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