Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

1. ジョブ実行のフォールトトレランス

Flink のエラー回復メカニズムは、実行レベルのフェイルオーバー戦略と実行グラフ レベルのジョブ再開戦略という複数のレベルに分かれています。エラーが発生すると、Flink はまず小規模なエラー回復メカニズムの起動を試みます。それでも対処できない場合は、より大規模なエラー回復メカニズムにアップグレードします。詳細については、以下のシーケンス図を参照してください。

タスク エラーが発生すると、TaskManager は RPC を介して JobManager に通知し、対応する実行のステータスを失敗に変更して、フェイルオーバー戦略をトリガーします。フェイルオーバー ポリシーが満たされた場合、JobManager は実行を再開します。それ以外の場合は、ExecutionGraph の失敗にアップグレードされます。 ExecutionGraph が失敗すると、失敗状態になり、再起動戦略によって再起動するか (再起動状態)、異常終了するか (失敗状態) が決定されます。

1.1 タスクフェイルオーバー戦略

現在、タスク フェイルオーバー戦略には、RestartAll、RestartIndividualStrategy、RestartPipelinedRegionStrategy の 3 つがあります。

RestartAll: すべてのタスクを再起動することは、ジョブの一貫性を回復するための最も安全な戦略であり、他のフェイルオーバー戦略が失敗した場合のフォールバック戦略として使用されます。現在、デフォルトのタスク フェイルオーバー戦略です。

RestartPipelinedRegionStrategy: エラー タスクが配置されているリージョン内のすべてのタスクを再起動します。タスク領域は、タスクのデータ送信によって決定されます。データ送信のあるタスクは同じ領域に配置され、異なる領域間でのデータ交換は行われません。

RestartIndividualStrategy: 単一のタスクを再開します。タスクにデータ ソースが含まれていない場合、データを再ストリームできず、データが失われる可能性があります。少なくとも 1 回の配信セマンティクスの提供を考慮すると、この戦略の使用範囲は比較的限定されており、タスク間でデータ転送がないジョブにのみ適用されます。

1.2 ジョブ再開戦略

タスク エラーによって最終的に完全な再起動がトリガーされた場合、ジョブの再起動戦略によってジョブを再開する必要があるかどうかが制御されます。 Flink は、ジョブ固有の 3 つの再起動戦略を提供します。

FixedDelayRestartStrategy: 指定された回数以内であれば実行の失敗を許可します。この回数を超えると、ジョブは失敗します。 FixedDelayRestartStrategy 再起動では、一定の遅延を設定して、頻繁な再試行によって発生する外部システムの負荷と不要なエラー ログを軽減できます。

FailureRateRestartStrategy: 指定された時間枠内で、指定された回数だけ実行が失敗することを許可します。この頻度を超えると、ジョブは失敗します。同様に、FailureRateRestartStrategy でも一定の再起動遅延を設定できます。

NoRestartStrategy: 実行が失敗した場合にジョブを直接失敗させます。

2. デーモンフォールトトレランス

YARN 上の Flink のデプロイメント モードでは、主要なデーモンは JobManager と TaskManager です。JobManager の主な役割は、リソースを調整し、ジョブの実行を管理することです。これは、それぞれ ResourceManager デーモン スレッドと JobMaster デーモン スレッドによって実行されます。次の図に、3 つの関係を示します。

2.1 タスクマネージャーのフォールトトレランス

ResourceManager は、ハートビート タイムアウトによって TaskManager の障害を検出するか、クラスター マネージャーから通知を受けた場合、対応する JobMaster に通知し、新しい TaskManager を起動して置き換えます。 ResourceManager は Flink ジョブを気にしないことに注意してください。Flink ジョブがどのように反応するかを管理するのは JobMaster の責任です。

JobMaster は、ResourceManager からの通知を通じて TaskManager の障害を知ったり、ハートビートのタイムアウトを検出したりした場合、まず TaskManager をスロット プールから削除し、TaskManager で実行中のすべてのタスクを失敗としてマークします。これにより、Flink ジョブ実行のフォールト トレランス メカニズムがトリガーされ、ジョブが回復されます。

TaskManager のステータスはチェックポイントに書き込まれており、再起動後に自動的に復元されるため、データの不整合の問題は発生しません。

2.2. リソースマネージャのフォールトトレランス

TaskManager がハートビート タイムアウトによって ResourceManager の障害を検出した場合、または ResourceManager がリーダーシップを失ったという通知を Zookeeper から受信した場合、TaskManager は新しいリーダーを探し、ResourceManager はタスクの実行を中断することなく、再起動してそのリーダーに登録します。

JobMaster がハートビート タイムアウトによって ResourceManager の障害を検出した場合、または ResourceManager がリーダーシップを失ったという通知を Zookeeper から受け取った場合、JobMaster は新しい ResourceManager がリーダーになるまで待機し、すべての TaskManager を再要求します。 TaskManager も正常に回復する可能性があることを考慮して、JobMaster によって新たに要求された TaskManager は、一定期間アイドル状態になった後に解放されます。

ResourceManager は、アクティブなコンテナー、使用可能な TaskManager、TaskManager と JobMaster 間のマッピング関係など、多くのステータス情報を保持します。ただし、この情報は真実ではなく、JobMaster と TaskManager とのステータス同期から取得できるため、この情報を永続化する必要はありません。

2.3 ジョブマスターのフォールトトレランス

TaskManager がハートビート タイムアウトによって JobMaster の障害を検出した場合、または JobMaster がリーダーシップを失ったという通知を Zookeeper から受信した場合、TaskManager は独自のエラー回復をトリガーし、新しい JobMaster を待機します。一定期間経過しても新しい JobMaster が表示されない場合、TaskManager はそのスロットを空きとしてマークし、ResourceManager に通知します。

ResourceManager がハートビート タイムアウトによって JobMaster の障害を検出した場合、または JobMaster がリーダーシップを失ったという通知を Zookeeper から受信した場合、ResourceManager は TaskManager に障害を通知し、他のアクションは処理しません。

JobMaster はジョブ実行に重要な多くの状態を保存します。その中でも、JobGraph とユーザー コードは HDFS などの永続ストレージから取得され、チェックポイント情報は Zookeeper から取得され、タスク実行情報はジョブ全体が再スケジュールされるため復元されない可能性があり、保持されたスロットは ResourceManager の TaskManager の同期情報から復元されます。

2.4 同時障害

YARN デプロイメント モードの Flink では、JobMaster と ResourceManager の両方が JobManager プロセス内にあるため、JobManager プロセスに問題がある場合は、通常、JobMaster と ResourceManager の同時障害です。その場合、TaskManager は次のように処理します。

  • 通常の JobMaster 障害処理手順に従ってください。
  • 一定期間にわたって、新しい JobMaster にスロットを提供し続けます。
  • ResourceManager への登録を試行し続けます。

新しい JobManager は、YARN のアプリケーション試行再試行メカニズムに依存して自動的に起動されることに注意してください。Flink で構成された YARN アプリケーション: keep-containers-across-application-attempts 動作によれば、TaskManager はクリーンアップされないため、新しく起動された Flink ResourceManager および JobMaster に再登録できます。

結論

Flink のフォールト トレランス メカニズムは、Flink の信頼性と耐久性を保証します。具体的には、ジョブ実行フォールト トレランスとデーモン フォールト トレランスの 2 つの側面が含まれます。ジョブ実行のフォールト トレランスに関して、Flink は、障害が発生した場合に自動的に再試行するためのタスク レベルのフェイルオーバー戦略とジョブ レベルの再起動戦略を提供します。デーモンのフォールト トレランスに関しては、YARN モードでは、Flink は内部コンポーネントのハートビートと YARN モニタリングを通じて障害検出を実行します。 TaskManager の障害は、新しい TaskManager を申請してタスクまたはジョブを再起動することで回復できます。JobManager の障害は、クラスター マネージャーが新しい JobManager を自動的にプルアップし、TaskManager を新しいリーダー JobManager に再登録することで回復できます。

上記は、Flink のフォールト トレラント メカニズム、ジョブ実行、デーモンの詳細について簡単に説明したものです。Flink のフォールト トレラント メカニズム、ジョブ実行、デーモンの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • SpringBootはFlinkのデプロイとパッケージ化の方法を詳細に説明しています
  • Flink エントリーレベルのアプリケーションドメイン名処理の例
  • Flinkのコア原則を分析し、コア抽象化を実装する
  • Flink はどのようなデータ型をサポートしていますか?
  • Flink ストリーム処理エンジン ゼロベース クイックパス: データ抽出

<<:  MySQLのネクストキーロックのロック範囲についての簡単な説明

>>:  jsを呼び出すいくつかの方法が整理され、使用が推奨されています

推薦する

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

CSS の Flex レイアウトを使用してシンプルな縦棒グラフを作成する方法

以下は、Flex レイアウトを使用した棒グラフです。 HTML: <div class=&qu...

CSSを使用してファイルアップロードパターンを描画する

以下に示すように、あなたならどのようにそれを達成しますか: 通常、フォントアイコンを使用して中央にプ...

LeetCode の SQL 実装 (197. 気温上昇)

[LeetCode] 197.気温上昇Weather テーブルが指定されている場合、前の日付 (昨...

jsは動的にテーブルを生成します(ノード操作)

この記事の例では、テーブルを動的に生成するjsの具体的なコードを参考までに共有しています。具体的な内...

入力と画像を揃えるためにvertical-alignを使用します

input と img を同じ行に配置すると、img タグが常に input より 1 つ上になり、...

WeChatアプレット開発によりホームページポップアップボックスアクティビティガイダンス機能が実現

目次1. 需要2. データベース設計3.Javaバックグラウンド構成の実装4. WeChatアプレッ...

Vue でコンポーネントを一括インポート、登録、使用する方法

序文コンポーネントは、非常に頻繁に使用されるものです。多くの人は、コンポーネントを 1 つのファイル...

初心者向けに Docker に Jenkins をインストールする方法を詳しく説明したチュートリアル

Jenkins はオープンソース ソフトウェア プロジェクトです。Java をベースに開発された継続...

Nginx の動的および静的分離実装ケースのコード分析

静的と動的の分離動的リクエストと静的リクエストはミドルウェアを通じて分離され、不要なリクエストの消費...

ElementUIテーブルのヘッダーアイコンにフローティングプロンプトを追加します。

この記事では主に、ElementUI テーブルのヘッダー アイコンにフローティング プロンプトを追加...

仕事の効率を上げるJS略語スキル20選

目次複数の変数を同時に宣言する場合は、1 行に短縮できます。分割代入は複数の変数に同時に値を割り当て...

リクエストを転送したり、静的リソースファイルにアクセスしたりする複数の場所への nginx の実装

この記事では主に、リクエストを転送したり、静的リソース ファイルにアクセスしたりする nginx の...

JSはモバイル端末の画面を1つずつ上下にスライドさせる機能を実装します

この記事では、モバイル端末を一度に1画面ずつ上下にスライドさせるためのJSの具体的なコードを参考まで...