web-dev-qa-db-ja.com

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

Cluster Mode Overview を読んでも、Spark Standaloneクラスタのさまざまなプロセスと並列処理を理解できません。

WorkerはJVMプロセスかどうか私はbin\start-slave.shを実行し、それがワーカーを生み出したことを発見しました。それは実際にはJVMです。

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

これらは私の質問です:

  1. エグゼキュータはアプリケーションごとにあります。それでは、労働者の役割は何ですか?それはエグゼキュータと連携し、その結果をドライバに送り返しますか?それともドライバーは直接executorに話しますか?もしそうなら、労働者の目的は何ですか?

  2. アプリケーションのエグゼキュータの数を制御する方法3.タスクをエグゼキュータ内で並行して実行するようにできますか。もしそうなら、どのようにexecutorのためのスレッド数を設定するのですか?

  3. Worker、executor、executor core(--total-executor-cores)の関係は何ですか?

  4. ノードあたりのワーカー数を増やすとはどういう意味ですか?

更新済み

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

例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 。

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

180
learninghuman

enter image description here

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

DRIVER

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

エグゼキュータ

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

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

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

  1. スタンドアロンアプリケーションがSparkContextインスタンスを起動してインスタンス化します(アプリケーションをドライバと呼ぶことができるのはそのときだけです)。
  2. ドライバプログラムはエグゼキュータを起動するためにクラスタマネージャにリソースを要求します。
  3. クラスタマネージャがエグゼキュータを起動します。
  4. ドライバプロセスはユーザアプリケーションを介して実行されます。アクションとRDDを介した変換に応じて、タスクはエグゼキュータに送信されます。
  5. 実行者がタスクを実行して結果を保存します。
  6. ワーカーがクラッシュした場合、そのタスクは別のエグゼキュータに送信されて再び処理されます。 「Sparkの学習:超高速ビッグデータ分析」という本で、SparkとFault Toleranceについて説明しています。

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

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

あなたの質問

  1. エグゼキュータが起動されると、ドライバに自分自身を登録し、それ以降は直接通信します。ワーカーは、自分のリソースの可用性についてクラスタマネージャに通知することを担当します。

  2. YARNクラスタでは--num-executorを使ってそれを行うことができます。スタンドアローンクラスタでは、spark.executor.coresで作業し、1人のワーカーに複数のexecutorを保持するのに十分なコアがない限り、ワーカーごとに1つのexecutorがあります。 (@JacekLaskowskiが指摘したように、--num-executorsはもはやYARNでは使用されていません https://github.com/Apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66

  3. --executor-coresを使用して、executorごとのコア数を割り当てることができます。

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

  5. Sean Owenがこの中で言っているように thread :「マシンごとに複数のワーカーを走らせるのに良い理由はありません」。たとえば、1台のマシンに多数のJVMがあるとします。

UPDATE

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

例1:Sparkはスケジューラが提供するのと同じ数のコアとエグゼキュータを欲張って獲得します。それで、結局あなたはそれぞれ8コアを持つ5エクゼキュータを得るでしょう。

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

222
Marco