Cluster Mode Overview を読んでも、Spark Standaloneクラスタのさまざまなプロセスと並列処理を理解できません。
WorkerはJVMプロセスかどうか私はbin\start-slave.sh
を実行し、それがワーカーを生み出したことを発見しました。それは実際にはJVMです。
上記のリンクに従って、エグゼキュータは、タスクを実行するワーカーノード上のアプリケーションに対して起動されるプロセスです。 ExecutorもJVMです。
これらは私の質問です:
エグゼキュータはアプリケーションごとにあります。それでは、労働者の役割は何ですか?それはエグゼキュータと連携し、その結果をドライバに送り返しますか?それともドライバーは直接executorに話しますか?もしそうなら、労働者の目的は何ですか?
アプリケーションのエグゼキュータの数を制御する方法3.タスクをエグゼキュータ内で並行して実行するようにできますか。もしそうなら、どのようにexecutorのためのスレッド数を設定するのですか?
Worker、executor、executor core(--total-executor-cores)の関係は何ですか?
ノードあたりのワーカー数を増やすとはどういう意味ですか?
更新済み
例を挙げて理解を深めましょう。
例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 。
これらの各例では、エグゼキュータはいくつありますか。エクゼキュータあたりのスレッド数は?コアの数アプリケーションごとに実行プログラムの数はどのように決まりますか。それは常に労働者の数と同じですか?
Sparkはマスター/スレーブアーキテクチャを使用しています。図からわかるように、多くの分散ワーカー(エグゼキュータ)と通信する1つの中央コーディネータ(ドライバ)があります。ドライバと各エグゼキュータはそれぞれ独自のJavaプロセスで実行されます。
DRIVER
ドライバーは、mainメソッドが実行されるプロセスです。最初にユーザープログラムをタスクに変換し、その後executorでタスクをスケジュールします。
エグゼキュータ
エグゼキュータは、特定のSparkジョブで個々のタスクを実行する作業を担当するワーカーノードのプロセスです。これらはSparkアプリケーションの開始時に起動され、通常はアプリケーションの有効期間全体にわたって実行されます。タスクを実行したら、結果をドライバに送信します。また、Block Managerを介してユーザープログラムによってキャッシュされるRDD用のメモリ内ストレージも提供します。
アプリケーション実行フロー
これを念頭に置いて、spark-submitを使用してアプリケーションをクラスターに送信すると、これが内部的に発生します。
SparkContext
インスタンスを起動してインスタンス化します(アプリケーションをドライバと呼ぶことができるのはそのときだけです)。Sparkは、失敗したタスクや遅いタスクを再実行することで、失敗したマシンや遅いマシンを自動的に処理します。たとえば、map()操作のパーティションを実行しているノードがクラッシュした場合、Sparkは別のノードでそれを再実行します。ノードがクラッシュせず、他のノードよりもはるかに遅い場合でも、Sparkは別のノードでタスクの「投機的」コピーを優先的に起動し、それが完了した場合はその結果を受け取ることができます。
あなたの質問
エグゼキュータが起動されると、ドライバに自分自身を登録し、それ以降は直接通信します。ワーカーは、自分のリソースの可用性についてクラスタマネージャに通知することを担当します。
YARNクラスタでは--num-executorを使ってそれを行うことができます。スタンドアローンクラスタでは、spark.executor.coresで作業し、1人のワーカーに複数のexecutorを保持するのに十分なコアがない限り、ワーカーごとに1つのexecutorがあります。 (@JacekLaskowskiが指摘したように、--num-executorsはもはやYARNでは使用されていません https://github.com/Apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )
--executor-coresを使用して、executorごとのコア数を割り当てることができます。
--total-executor-coresは、アプリケーションごとのエグゼキュータコアの最大数です。
Sean Owenがこの中で言っているように thread :「マシンごとに複数のワーカーを走らせるのに良い理由はありません」。たとえば、1台のマシンに多数のJVMがあるとします。
UPDATE
私はこのシナリオをテストすることができませんでした、しかしドキュメンテーションに従って:
例1:Sparkはスケジューラが提供するのと同じ数のコアとエグゼキュータを欲張って獲得します。それで、結局あなたはそれぞれ8コアを持つ5エクゼキュータを得るでしょう。
例2〜5:Sparkは1人のワーカーで要求された数のコアを割り当てることができないため、エグゼキュータは起動されません。