以下では、すべての時点で1つのSparkジョブのみが実行されていると仮定します。
これまでに得たもの
Sparkで何が発生するかを理解します。
- ときに
SparkContext
作成され、各ワーカーノードは、executorを開始します。エグゼキューターは、ドライバープログラムに接続する個別のプロセス(JVM)です。各エグゼキュータは、ドライバプログラムのjarを持っています。ドライバーを終了すると、実行プログラムがシャットダウンされます。各エグゼキュータはいくつかのパーティションを保持できます。 - ジョブが実行されると、系統グラフに従って実行計画が作成されます。
- 実行ジョブは複数のステージに分割され、ステージには(リネージュグラフで)隣接する変換とアクションがすべて含まれますが、シャッフルは含まれません。したがって、ステージはシャッフルによって分離されます。
という事は承知しています
- タスクは、Functionオブジェクトをシリアル化することによってドライバーからエグゼキューターに送信されるコマンドです。
- エグゼキューターは、コマンド(タスク)を(ドライバーjarを使用して)逆シリアル化し、パーティションで実行します。
だが
質問
ステージをこれらのタスクに分割するにはどうすればよいですか?
具体的には:
- タスクは変換とアクションによって決定されますか、それとも複数の変換/アクションがタスクに含まれる可能性がありますか?
- タスクはパーティションによって決定されますか(パーティションごとのステージごとに1つのタスクなど)。
- タスクはノードによって決定されますか(ノードごとのステージごとに1つのタスクなど)?
私が思うこと(たとえ正しいとしても、部分的な答えのみ)
でhttps://0x0fff.com/spark-architecture-shuffle、シャッフルを画像で説明されています
そして、私はルールが
ノードの数に関係なく、各ステージは#number-of-partitionsタスクに分割されます
最初の画像では、3つのマップタスクと3つの縮小タスクがあると思います。
0x0fffからの画像の場合、8つのマップタスクと3つの削減タスクがあると思います(オレンジとダークグリーンのファイルが3つしかない場合)。
いずれにせよ未解決の質問
あれは正しいですか?しかし、それが正しいとしても、複数の操作(たとえば、複数のマップ)が1つのタスク内にあるか、操作ごとに1つのタスクに分かれているかに関わらず、上記の私の質問にはまだ回答がありません。
他の人が言うこと
Sparkのタスクとは何ですか?Sparkワーカーはjarファイルをどのように実行しますか?そして、Apache Sparkスケジューラーはどのようにファイルをタスクに分割しますか?似ていますが、質問が明確に回答されているとは思いませんでした。