注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Flink の基礎

Apache Flink は、無制限のデータセットを低遅延で処理できる分散計算エンジンで、一般的なストリーミングワークフローに対応できます。Foundry のストリーミングでは、基盤となるエンジンとして Flink を使用し、ユーザーコードや、オントロジーへのリアルタイムのデータ反映、ストリーミングによる時系列データの取り込みといったプラットフォーム内のストリーミングアプリケーションを実行します。

ストリーミングのユースケースでジョブの追加設定が必要かどうかを判断するには、Flink の仕組みをある程度理解しておくと役立ちます。

Flink のより詳細なドキュメントは、Flink のホームページ ↗で確認できます。

すべてのストリーミングジョブは、データソースに対して処理を行い、結果をデータシンクに書き込む一連の操作として記述されます。これらの操作には、集計、結合、文字列のパースや算術演算などの行レベルの処理が含まれます。Flink では、各操作を Operator という抽象概念で表現します。Flink では、ソースとシンクもオペレーターで記述されます。

Flink ジョブは、内部では「ジョブグラフ」または「論理グラフ」として表現されます。ジョブグラフは、オペレーターをノードとし、エッジがオペレーター間の関係を定義する有向グラフです。Flink にジョブを送信すると、ジョブグラフが作成されます。Flink ジョブのジョブグラフのプレビューは、Foundry Job Tracker のジョブの詳細セクションに表示されます。

実際にジョブを実行するとき、Flink は論理グラフを物理グラフに変換します。これは、計算ランタイム上でオペレーターがどのように実行されるかを表すものです。物理グラフは、Flink ジョブにおける作業の基本単位であるタスクで構成されます。タスクは、オペレーターの1個のインスタンス、または連結された多数のオペレーターを表します。

Job Manager と Task Manager

Spark と同様に、Flink のランタイムアーキテクチャにも異なる種類のワーカーが含まれます。Spark はドライバーを使用してジョブの調整と管理を行い、エグゼキューターを使用してジョブのタスクを実行します。一方、Flink は Job Manager と Task Manager を使用し、それぞれ Spark のドライバーとエグゼキューターにおおむね相当する役割を果たします。

Flink の Job Manager は、タスクのスケジュールとタスクへのリソース割り当て、完了したタスクや失敗したタスクの処理、ジョブの Checkpoint と障害復旧の調整、およびジョブ情報へのプログラムによるアクセスの提供を担います。通常、どの時点でもアクティブな Job Manager はリーダーの1個のみで、復旧不能なエラーに備えてバックアップが待機状態に保たれます。

Flink の Task Manager は、タスクの実行、およびストリーム間のデータのバッファリングと交換を担います。Task Manager は常に1個以上存在しますが、ストリーム処理を並列化するために、さらに多く存在する場合もあります。Task Manager が非常に大きなレコードを処理する必要がある場合、追加のリソースが必要になることがあります。ストリームのスループットが極めて高い場合は、ジョブの並列度を上げる必要があることがあり、その結果、Task Manager の数が増加します。

ジョブの状態

Flink の操作には、個々のイベントを単独で確認するだけでよいものもあれば、複数のイベントにわたって情報を記憶する必要があるものもあります。後者はステートフルな操作です。ステートフルな操作の例を次に示します。

  • 集計: たとえば、5分間のローリングウィンドウにおけるイベントの総数をカウントしたり、既知のすべてのイベントの累積平均を計算したりします。
  • 結合: 実行エンジンは、現在取り込まれているイベントと結合するために、以前に確認したイベントの情報を把握している必要があります。

ステートフルな操作に必要な情報はジョブの状態と呼ばれ、Flink が状態バックエンドを使用して保存します。状態は Task Manager によって管理・保存され、Job Manager が Checkpoint の形式で調整します。状態が大きい場合(集計や結合のウィンドウが非常に大きい場合など)、Job Manager と Task Manager に追加のリソースが必要になることがあります。