Amazon Managed Service for Apache Flink アプリケーションのチェックポイントまたはセーブポイントで継続的に障害が発生します。
簡単な説明
チェックポイントは、Amazon マネージドサービスの Apache Flink にフォールトトレランスを実装するための方法です。アプリケーションを最適化または適切にプロビジョニングしないと、チェックポイント障害が発生する可能性があります。
チェックポイント障害の主な原因を次に示します。
- Rocks DB の場合、Apache Flink はローカルストレージからファイルを読み取り、Amazon Simple Storage Service (Amazon S3) であるリモートの永続ストレージに書き込みます。ローカルディスクのパフォーマンスとアップロード速度がチェックポイントに影響し、チェックポイント障害が発生する可能性があります。
- セーブポイントとチェックポイントの状態は、AWS が完全に管理する、サービス所有の Amazon S3 バケットに保存されます。これらの状態は、アプリケーションがフェイルオーバーするたびにアクセスされます。S3 バケットの一時的なサーバーエラーまたは遅延により、チェックポイント障害が発生する可能性があります。
- チェックポイント中に関数が外部リソースと通信するように作成したプロセス関数 (Amazon DynamoDB など) では、チェックポイントが失敗する可能性があります。
- シリアライザーと入力データの不一致などの状態のシリアル化により、チェックポイント障害が発生する可能性があります。
- アプリケーションにプロビジョニングされている Kinesis プロセッシングユニット (KPU) の数が十分でない可能性があります。割り当てられた KPU を特定するには、次の計算を使用します。
アプリケーションに割り当てられたKPU = 並列処理/KPU ごとの並列処理
- アプリケーションの状態サイズが大きくなると、チェックポイントの待ち時間が長くなる可能性があります。タスクマネージャーでチェックポイントの保存に時間がかかり、メモリ不足の例外が発生する可能性があります。
- 状態分布が偏っていると、あるタスクマネージャーが他のタスクマネージャーよりも多くのデータを処理する可能性があります。十分な KPU (リソース) がプロビジョニングされていても、タスクマネージャーが過負荷になると、メモリ不足の例外が発生する可能性があります。
- カーディナリティが高い場合は、受信データに多数のユニークなキーがあることが示唆されます。ジョブが KeyBy 演算子を使用して入力データを分割し、そのデータを含むキーのカーディナリティが高い場合、チェックポイントが遅くなる可能性があります。チェックポイント処理が遅いと、最終的にチェックポイント障害が発生する可能性があります。
解決策
障害が発生している Amazon Managed Service for Apache Flink アプリケーションのトラブルシューティングを行うには、以下のアクションを実行してください。
- Amazon CloudWatch メトリクス lastCheckPointDuration および lastCheckpointSize を使用して、チェックポイントのサイズと期間を監視します。アプリケーション状態のサイズが急激に増加し、チェックポイントのサイズと期間が長くなる可能性があります。詳しくは、「アプリケーションメトリクス」を参照してください。
- 多くのデータを処理するオペレーターの並列処理を増やします。setParallelism () メソッドを使用すると、個々のオペレータ、データソース、またはデータシンクの並列処理を定義できます。詳細については、Flink のウェブサイトで「並列実行」を参照してください。
注: オペレーターの並列処理を増やすと、チェックポイントの合計時間に影響する可能性があります。整列されていないチェックポイントを使用して、適宜最適化することもできます。詳細については、Flink のウェブサイトで「バックプレッシャー下でのチェックポイント」を参照してください。
- KPU を最適に使用できるように、Parallelism および ParallelismPerKPU 値を調整します。Amazon Managed Service for Apache Flink アプリケーションで自動スケーリングが有効になっていることを確認します。maxParallelism パラメータの値により、KPU の数をスケーリングできます。詳細については、「Amazon Managed Service for Apache Flink でアプリケーションをスケーリングする」を参照してください。
- ステートに TTL を定義して、ステートが定期的にクリーンアップされるようにします。詳細については、Flink のウェブサイトで「クラス StateTtlConfig.Builder」を参照してください。
- コードを最適化してパーティショニングを改善します。リバランスパーティショニングを使用すると、データを均等に分散できます。リバランスパーティショニングは、ラウンドロビン方式を使用して分散します。詳細については、Flink のウェブサイトで「リバランス」を参照してください。
- コードを最適化してウィンドウサイズを小さくすると、ウィンドウ内のキー数のカーディナリティが小さくなります。
関連情報
チェックポイント (Flink のウェブサイト)
Apache Flink 用のマネージドサービスにおけるフォールトトレランスの実装