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

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

スケジューリング

Flink内での実行リソースはタスク スロットを通じて定義されます。各タスクマネージャーは1つ以上のタスクスロットを持ちます。それぞれは並行タスクの1つのパイプラインを実行することができます。A pipeline consists of multiple successive tasks, such as the n-th parallel instance of a MapFunction together with the n-th parallel instance of a ReduceFunction. Flinkはしばしば連続するタスクを同時に実行することに注意してください: ストリーミングプログラムではいずれにしても起こりますが、バッチプログラムについてもしばしば起こります。

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

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

Internally, Flink defines through SlotSharingGroup and CoLocationGroup which tasks may share a slot (permissive), respectively which tasks must be strictly placed into the same slot.

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

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

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

ジョブマネージャーはジョブグラフを ExecutionGraphに変換します。ExecutionGraphはジョブグラフの並行バージョンです: 各JobVertexに関して並行サブタスクごとにExecutionVertex を含みます。並行度100のオペレータは1つのJobVertexと100のExecutionVerticesを持つでしょう。ExecutionVertexは特定のサブタスクの実行状態を追跡します。All ExecutionVertices from one JobVertex are held in an ExecutionJobVertex, which tracks the status of the operator as a whole. verticesの他に、ExecutionGraph はIntermediateResultIntermediateResultPartitionも含みます。前者はIntermediateDataSetの状態を追跡し、後者はそのパーティションそれぞれの状態を追跡します。

ジョブグラフと ExecutionGraph

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

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

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

Unlike the states finished, canceled and failed which denote a globally terminal state and, thus, trigger the clean up of the job, the suspended state is only locally terminal. Locally terminal means that the execution of the job has been terminated on the respective JobManager but another JobManager of the Flink cluster can retrieve the job from the persistent HA store and restart it. 結果的に、suspended 状態になったジョブは完全には後片付けされないでしょう。

Flinkのジョブの状態と移行

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

タスク実行の状態と移行
TOP
inserted by FC2 system