ジョブとスケジューリング

このドキュメントはFlinkがどのようにジョブをスケジュールし、どのようにそれを表現し、ジョブマネージャー上でジョブの状態を追跡するかを簡単に説明します。

スケジューリング

Flink内での実行リソースはタスク スロットを通じて定義されます。各タスクマネージャーは1つ以上のタスクスロットを持ちます。それぞれは並行タスクの1つのパイプラインを実行することができます。パイプラインはMapFunctionのn次の並行インスタンスとReduceFunctionのn次の並行インスタンスのような、複数の連続するタスクからなります。Flinkはしばしば連続するタスクを同時に実行することに注意してください: ストリーミングプログラムではいずれにしても起こりますが、バッチプログラムについてもしばしば起こります。

以下の図はそれを示しています。データソース、MapFunction およびReduceFunctionを持つプログラムを考えます。ソースとMapFunctionは並行度4で実行されますが、ReduceFunction は並行度3で実行されます。パイプラインは連続するソース - Map - Reduceから成ります。それぞれ3つのスロットを持つ2つのタスクマネージャーのクラスタ上で、プログラムは以下に示すように実行されるでしょう。

タスクのパイプラインをスロットに割り当てる

内部的には、Flinkはタスクがスロット(任意)を共有するかもしれないSlotSharingGroupCoLocationGroup を使って定義されます。それぞれのタスクは厳密に同じスロット内に配置されなければなりません。

ジョブマネージャー データ構造

ジョブの実行の間、ジョブマネージャーは分散タスクを追跡し続け、いつ次のタスク(あるいはタスクのセット)を実行するかを決定し、終了したタスクあるいは実行の失敗に対して反応します。

ジョブマネージャは JobGraphを受け取ります。これはオペレータ(JobVertex) と中間結果(IntermediateDataSet)から成るデータフローを表します。各オペレータは、並行度および実行するコードのようなプロパティを持ちます。更に、ジョブグラフはアタッチされたライブラリのセットを持ちます。それはオペレータのコードを実行するために必要なものです。

ジョブマネージャーはジョブグラフを ExecutionGraphに変換します。ExecutionGraphはジョブグラフの並行バージョンです: 各JobVertexに関して並行サブタスクごとにExecutionVertex を含みます。並行度100のオペレータは1つのJobVertexと100のExecutionVerticesを持つでしょう。ExecutionVertexは特定のサブタスクの実行状態を追跡します。1つのJobVertexからの全ての ExecutionVertices はExecutionJobVertexの中に含まれなければなりません。これは全体としてオペレータの状態を追跡します。verticesの他に、ExecutionGraph はIntermediateResultIntermediateResultPartitionも含みます。前者はIntermediateDataSetの状態を追跡し、後者はそのパーティションそれぞれの状態を追跡します。

ジョブグラフと ExecutionGraph

各 ExecutionGraph はそれに関するジョブの状態を持ちます。子のジョブの状態はジョブの実行の現在の状態を示します。

Flinkのジョブはまずcreated 状態になり、そしてrunning に切り替わり、全ての作業の終了時にfinishedに切り替わります。失敗時には、ジョブは全ての実行中のタスクが中止された場所でまずfailingに切り替わります。もしジョブのverticesが最終状態に達し、ジョブが再起動可能で無ければ、ジョブは failedに移行します。ジョブが再起動できる場合は、restarting 状態になるでしょう。一旦ジョブが完全に再起動すると、created 状態になるでしょう。

ユーザがジョブを中止した場合は、cancelling 状態になるでしょう。これは必然的に現在の全ての実行中のタスクの中止を伴います。一旦全ての実行中のタスクが最終状態になると、ジョブはcancelled状態に移行します。

グローバルに終端状態を宣言する状態finishedcanceledおよびfailedと異なり、suspended 状態はローカルにのみ終端です。ローカルで終端はジョブの実行がそれぞれのJobManagerで終了したがFlinkクラスタの他のJobManagerが永続的なHAソトアからジョブを取り出し再開することができることを意味します。結果的に、suspended 状態になったジョブは完全には後片付けされないでしょう。

Flinkのジョブの状態と移行

ExecutionGraph の実行中、各並行タスクはcreated から finished または failedへの複数のステージを経験します。以下の図は状態と、それらの間で取りうる移行を示します。タスクは複数回実行されるかもしれません(タオ手羽、障害の復旧の道筋)。そのような理由で、ExecutionVertex の実行は Executionの中で追跡されます。各 ExecutionVertex は現在の Execution と以前の Executions を持ちます。

タスク実行の状態と移行

上に戻る

TOP
inserted by FC2 system