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 2016

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

@KSHITIJKULSHRESTHAはい。
Shuai Zhang

私のSparkプロジェクトの単体テストでこれに遭遇しました(DataFrameSuiteBase)。@Dazzlerの答え、私は私が移動しなければならないことを理解DataFrame-creation内部のtest(..) { .. }スイートを。しかしDataFramesをlazy修正するように宣言するだけScalaです(love !)。これは、先の尖ったアウトがされてい@gyuseong彼の答え以下
Y2K-shubham

回答:


40

sparkContextオブジェクトはどこに定義されていますか?それはメイン関数内ですか?

私も同じ問題に直面しました。私が犯した間違いは、メイン関数の外側とクラスの内側でsparkContextを開始したことです。

メイン関数内で開始したところ、問題なく動作しました。


11
Sparkは本当に改善する必要があります。何か問題が発生すると、混乱を招き、情報が得られないエラーメッセージが表示されるだけです
Shuai Zhang

3
これは回避策であり、解決策ではありません。SingletionContextを作成し、複数のアプリケーションのメイン機能とは別に、Contextの別のレイヤーを作成したい場合はどうなりますか?
Murtaza Kanchwala

1
「アプリケーションはmain()を拡張する代わりにメソッドを定義する必要があることに注意してくださいscala.App。のサブクラスはscala.App正しく機能しない可能性があります。」Spark 2.1.0マニュアル
ruhong

getOrCreate()コンテキストを試行する場所はドライバーレベルで作成し、必要に応じてエグゼキューターレベルに渡す必要があることに注意してください。
2018

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を他の2つの場所のいずれかで指定する必要があります。$ SPARK_HOME / conf / spark-defaults.conf(これはClouderaマネージャーが配置する場所です)、または送信時にコマンドラインで指定します。アプリ。(例:spark-submit-マスター糸)。

このようにspark.masterを「ローカル」に指定すると、以下のコメントに示されているように、sparkは単一のJVMで実行されます。次に--deploy-mode clusterを指定しようとすると、「クラスターのデプロイモードはマスター「ローカル」と互換性がありません」というエラーが発生します。これは、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 2017

これは私にとってはうまくいきましたが、誰かが.config( "spark.master"、 "local")が何をしているのかを初心者(私)に説明できますか?私のコードは、jarにコンパイルして本番環境で実行しても問題ありませんか?
user1761806

4
@ user1761806多くの回答はこれを修正として報告していますが、単一のJVMを使用するだけで、sparkプロセスの方法を根本的に変更します。ローカルはローカルのテストに使用され、クラスターにデプロイする場合、この問題を修正するための正しいソリューションではありません。私にも同様の問題があり、受け入れられた答えは私の問題に対する正しい解決策でした。
ナサニエルウェント2017

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 2017年

これは問題を解決します。(setMaster("local[2]")説明があれば)の意味については(まだ)わかりませんが、この回答は問題の解決策と見なすことができます。
リック

この情報を含めるために回答を編集しました:)
Rick

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に渡すことが可能なフォーマットのリストのためのリンクです

参考:スパークチュートリアル - セットアップスパークエコシステム


私の日を救ってくれてありがとう!
GentleCoder 2017年

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 '20 / 07/20

設定してもエラーが発生する場合はどうなりますか?@ tom10271
アンナレオネンコ

@AnnaLeonenkoすみませんが、Sparkアプリケーションの開発を1年間停止しています。記憶を思い出せません。しかし、私はあなたのマスターノードがローカルではなく、スパークによって管理されていると思いますか?
tom10271

1
@AnnaLeonenko設定を確認しました。開発のためにローカルで実行していて、マスターノードの管理にSparkのみを使用している場合は、localまたはに設定しlocal[*]ます。私はAWS EMRにそれを展開するとき、それはのようにIセットマスタ、調整のために糸を使用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
これは回避策であり、解決策ではありません。SingletionContextを作成し、複数のアプリケーションのメイン機能とは別に、Contextの別のレイヤーを作成したい場合はどうなりますか?どのようにしてそれを達成できるかについてのコメントはありますか?
Murtaza Kanchwala 2016年

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 2017

なぜlocal [2]について説明できますか
SUDARSHAN '15年

> -ローカル[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 [*]")を追加する必要があります*はすべてのノードを意味します。81,2などのように指定できます

クラスター上にある場合はマスターURLを設定する必要があります


0

JavaSparkContextでSpark設定を指定しないと、このエラーが発生します。つまり、JavaSparkContext sc = new JavaSparkContext();

解決策:JavaSparkContextを提供しますsc = new JavaSparkContext(conf);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.