Spark Standaloneクラスターのワーカー、エグゼキューター、コアとは何ですか?


219

クラスターモードの概要を読みましたが、Sparkスタンドアロンクラスターのさまざまなプロセスと並列処理をまだ理解できません。

ワーカーはJVMプロセスですか?私はを実行したbin\start-slave.shところ、ワーカー(実際にはJVM)が起動されることがわかりました。

上記のリンクのとおり、エグゼキューターは、タスクを実行するワーカーノード上のアプリケーションに対して起動されるプロセスです。executorもJVMです。

これらは私の質問です:

  1. 実行者はアプリケーションごとです。では、労働者の役割は何でしょうか?それはエグゼキューターと調整し、結果をドライバーに伝えますか?または、ドライバーはエグゼキューターに直接話しかけますか?もしそうなら、労働者の目的は何ですか?

  2. アプリケーションのエグゼキューターの数を制御するにはどうすればよいですか?

  3. エグゼキューター内でタスクを並行して実行できますか?もしそうなら、どのようにエグゼキューターのスレッド数を設定しますか?

  4. ワーカー、エグゼキューター、エグゼキューターコア(--total-executor-cores)の関係は何ですか?

  5. ノードあたりのワーカー数が増えるとはどういう意味ですか?

更新しました

例を見て理解を深めましょう。

例1: 5つのワーカーノード(各ノードに8つのコアがある)を持つスタンドアロンクラスターデフォルトの設定でアプリケーションを起動したとき。

例2例1と 同じクラスター構成ですが、次の設定でアプリケーションを実行します--executor-cores 10 --total-executor-cores 10。

例3 例1と同じクラスター構成ですが、次の設定でアプリケーションを実行します--executor-cores 10 --total-executor-cores 50。

例4 例1と同じクラスター構成ですが、次の設定でアプリケーションを実行します--executor-cores 50 --total-executor-cores 50。

例5 例1と同じクラスター構成ですが、次の設定でアプリケーションを実行します--executor-cores 50 --total-executor-cores 10。

これらの各例では、エグゼキューターは何人ですか?エグゼキューターあたりのスレッド数は?コアはいくつですか?アプリケーションごとのエグゼキューターの数はどのように決定されますか?それは常に労働者の数と同じですか?

回答:


274

ここに画像の説明を入力してください

Sparkはマスター/スレーブアーキテクチャを使用します。図からわかるように、多くの分散ワーカー(エグゼキューター)と通信する1つの中央コーディネーター(ドライバー)があります。ドライバーと各エグゼキューターは、独自のJavaプロセスで実行されます。

運転者

ドライバーは、メインメソッドが実行されるプロセスです。まず、ユーザープログラムをタスクに変換し、その後、エグゼキュータでタスクをスケジュールします。

実行者

エグゼキューターは、特定のSparkジョブで個々のタスクを実行する担当のワーカーノードのプロセスです。これらは、Sparkアプリケーションの最初に起動され、通常、アプリケーションの存続期間全体にわたって実行されます。タスクを実行すると、結果をドライバーに送信します。また、ブロックマネージャーを介してユーザープログラムによってキャッシュされるRDDのメモリ内ストレージも提供します。

アプリケーション実行フロー

これを念頭に置いて、spark-submitを使用してクラスターにアプリケーションを送信すると、内部的に次のようになります。

  1. スタンドアロンアプリケーションが起動し、インスタンスをインスタンス化しSparkContextます(アプリケーションをドライバーと呼ぶことができるのはこのときだけです)。
  2. ドライバープログラムは、executorを起動するためのリソースをクラスターマネージャーに要求します。
  3. クラスターマネージャーはエグゼキューターを起動します。
  4. ドライバープロセスは、ユーザーアプリケーションを介して実行されます。RDDに対するアクションと変換に応じて、タスクがエグゼキュータに送信されます。
  5. エグゼキュータはタスクを実行し、結果を保存します。
  6. ワーカーがクラッシュした場合、そのタスクは別のエグゼキューターに送信され、再度処理されます。著書「Learning Spark:Lightning-Fast Big Data Analysis」では、Sparkとフォールトトレランスについて説明しています。

Sparkは、失敗したまたは遅いタスクを再実行することで、失敗したまたは遅いマシンを自動的に処理します。たとえば、map()オペレーションのパーティションを実行しているノードがクラッシュすると、Sparkはそれを別のノードで再実行します。ノードがクラッシュせず、他のノードよりもはるかに遅い場合でも、Sparkは別のノードでタスクの「投機的」コピーをプリエンプティブに起動し、それが終了した場合に結果を取得できます。

  1. ドライバーからSparkContext.stop()を使用するか、メインメソッドが終了またはクラッシュすると、すべてのエグゼキューターが終了し、クラスターリソースがクラスターマネージャーによって解放されます。

あなたの質問

  1. エグゼキュータが開始されると、エグゼキュータに自身を登録し、それ以降は直接通信します。ワーカーは、クラスターマネージャーにリソースの可用性を通知する責任があります。

  2. YARNクラスターでは、-num-executorsを使用してそれを行うことができます。スタンドアロンクラスターでは、spark.executor.coresでプレイし、ワーカーに複数のエグゼキューターを保持するのに十分なコアがない限り、ワーカーごとに1つのエグゼキューターを取得します。(@JacekLaskowskiが指摘したように、--num-executorsはYARN https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66で使用されなくなりました)

  3. --executor-coresを使用して、エグゼキューターあたりのコア数を割り当てることができます

  4. --total-executor-coresは、アプリケーションごとのエグゼキューターコアの最大数です。

  5. Sean Owenがこのスレッドで言ったように、「1台のマシンで複数のワーカーを実行することには、正当な理由はありません」。たとえば、1台のマシンに多数のJVMが存在することになります。

更新

私はこのシナリオをテストすることができませんでしたが、ドキュメントによると:

例1: Sparkは、スケジューラーが提供するのと同じ数のコアとエグゼキューターを貪欲に取得します。したがって、最終的には、それぞれ8つのコアを持つ5つのエグゼキューターが得られます。

例2〜5: Sparkは、単一のワーカーで要求された数のコアを割り当てることができないため、エグゼキューターは起動されません。


@Marcoに感謝します。したがって、通常、ワーカーはノードリソースを管理するだけなので、ワーカーのヒープメモリについて心配する必要はありませんか?
Manikandan Kannan

8
なんて素晴らしい答えでしょう!@Marcoに感謝します。あたりとしてgithub.com/apache/spark/commit/... --num-executors YARNに使用されなくなりました。
Jacek Laskowski、2015

1
@マルコは素晴らしい答えをありがとう。ドライバーの実行中にクラスターマネージャーの継続的な役割を拡張できますか?...利用可能なリソースを知るために、ドライバーまたはワーカー、あるいはその両方がクラッシュまたは応答を停止するケースを処理する必要があります。
Iain

1
@lainドライバーはリソースの割り当てについてクラスターマネージャーに連絡し、クラスターマネージャーにエグゼキュー
ターの

2
すばらしい答えです。あなたはここにスパーク内部に関する詳細な情報を見つけることができgithub.com/JerryLead/SparkInternals/blob/master/EnglishVersion/...
アマールGajbhiye

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