状態管理は、パフォーマンス、安定性、およびリソース使用率に影響します。不適切な状態管理は、システムクラッシュにつながる可能性があります。Datastream API を使用すると、柔軟な方法で状態サイズを管理できます。このトピックでは、Datastream API で構築されたデプロイメントの状態サイズを制御する方法について説明します。
背景情報
Apache Flink は、オペレーター状態とキー付き状態の 2 種類の状態をサポートしています。キー付き状態を使用すると、状態サイズが大きくなる可能性が高くなります。この問題に対処するために、ValueState、ListState、MapState インターフェースなどの DataStream API を使用して、キー付き状態を管理できます。また、状態の有効期限 (TTL) を設定して、状態データを期限切れにすることもできます。詳細については、「キー付き状態の使用」をご参照ください。
診断ツール
逆圧は、Apache Flink のパフォーマンスボトルネックの指標です。ほとんどの場合、逆圧は、状態サイズが継続的に増加し、割り当てられたメモリサイズを超えたために発生します。この場合、状態バックエンドは、使用頻度の低い状態データをディスクストレージに移動します。ただし、ディスクストレージ内のデータへのアクセスは、メモリ内のデータへのアクセスよりも大幅に遅くなります。オペレーターがディスクから状態データを頻繁に読み取る場合、データレイテンシが大幅に増加します。これにより、パフォーマンスボトルネックが発生します。
逆圧が状態サイズの肥大化によって引き起こされているかどうかを特定するには、デプロイメントとオペレーターの実行状態を徹底的に分析する必要があります。監視ツールと診断ツールを使用して、状態アクセスによって引き起こされるパフォーマンスの問題を特定し、解決できます。
Realtime Compute for Apache Flink の開発コンソール の診断ツールを次の表に示します。これらのツールをインテリジェントデプロイメント診断機能および自動チューニング機能と組み合わせて使用することで、状態の大きいデプロイメントのパフォーマンスチューニングを容易にすることができます。
ツール | 説明 | 使用方法 |
スレッドダンプ | オペレータースレッドが現在、主に状態データにアクセスしているかどうかを確認します。 | 詳細については、「デプロイメントのパフォーマンスの監視」をご参照ください。 |
特定の期間中に、オペレータースレッドが主に状態データにアクセスしているかどうかを確認します。 | ||
特定の期間中に、CPU 時間の大部分が状態データへのアクセスに使用されているかどうかを確認します。 | ||
ランタイムメトリクスの監視 | 関連するメトリクスを表示して、状態サイズと I/O オーバーヘッドを確認します。 | [デプロイメント] ページで表示するデプロイメントをクリックし、[ステータス] タブをクリックして、[アクション] セクションの [メトリクス] をクリックします。
次のメトリクスを表示できます。
|
チューニング方法
アプリケーション設計の再評価
アプリケーションにおける状態ストレージと管理の設計は非常に重要です。状態の無制限の増加を防ぐために、必要な情報のみを状態に保存します。
TTL を構成することで状態サイズを削減できます
Apache Flink は、状態データのライフサイクルを管理するのに役立つさまざまな方法を提供しています。たとえば、ValueStateDescriptor インターフェースの setTTL() メソッドを呼び出して、状態データを自動的に期限切れにしてクリアできます。また、clear() メソッドと remove() メソッドを呼び出して、不要になったレコードの状態データを削除することもできます。これは、状態サイズを制御するのに役立ちます。
タイマーを使用して状態をクリーンアップする
タイマーを使用して、状態のクリーンアップを定期的にトリガーできます。これにより、期限切れの状態データがタイムリーに削除され、状態の無制限の増加を防ぎます。さらに、状態データのライフサイクルをきめ細かく管理できます。
パフォーマンスの監視、ログの生成、および状態ファイルの分析
状態サイズと状態バックエンドに関連するパフォーマンスメトリクスを監視して、例外をタイムリーに検出します。トラブルシューティングを容易にするために、詳細なログを生成します。履歴状態ファイルを定期的に分析して、パターンと潜在的なリスクを特定し、この情報を使用して状態管理を最適化します。
ディスク読み取りを最小限に抑える
ディスク読み取りの回数を減らし、メモリの割り当てを最適化して、システムパフォーマンスを向上させます。
メモリの割り当てを最適化する
システム全体のリソースに影響を与えることなく、マネージドメモリにより多くのリソースを割り当てます。これにより、メモリ使用率が効果的に向上し、ディスクへのアクセスが削減されます。この方法を使用する前に、システムの他の部分に十分なメモリリソースがあることを確認してください。
メモリリソースを追加する
メモリリソースを追加し、状態ストレージエンジンにより多くのマネージドメモリを割り当てます。これにより、メモリ使用率が向上し、ディスクへのアクセスが削減されます。リソース設定のエキスパートモードでこの方法を使用して、きめ細かいリソース割り当てを実装し、最適なパフォーマンスを実現できます。
並列度を高める
並列度が高いほど、各サブタスクの状態サイズが小さくなり、ディスクに書き込まれるデータ量が減少します。この方法により、ディスク I/O 操作が効果的に削減され、データ処理効率が向上します。
次の表に、さまざまなシナリオで前述の方法を使用する方法を示します。
シナリオ | 方法 | 操作 | 注意事項 |
ヒープメモリなどの他のメモリリソースが十分にある | マネージドメモリにより多くのリソースを割り当てます。 |
| 他のメモリリソースが十分にあることを確認してください。そうでない場合、フルガベージコレクション (Full GC) が頻繁に発生し、パフォーマンスが低下する可能性があります。 |
すべてのシナリオ | メモリリソースを追加します。 | 詳細については、「デプロイメントのリソースを設定する」をご参照ください。 | 該当なし |
参照
状態サイズの肥大化によって引き起こされる問題とチューニングワークフローについては、「状態の大きいデプロイメントのパフォーマンスチューニング」をご参照ください。
Flink SQL は、パラメーター設定と SQL ステートメントに基づいてステートフルオペレーターを選択するためのオプティマイザーを利用します。大量のデータに対するステートフル計算のパフォーマンスを最適化するには、基礎となるメカニズムの基本的な理解が必要です。詳細については、「SQL デプロイメントで逆圧を軽減するための状態サイズの制御」をご参照ください。
チェックポイントとセーブポイントのタイムアウトを診断および防止する方法については、「チェックポイントとセーブポイントのタイムアウトの診断と防止」をご参照ください。
デプロイメントの起動時およびスケーリング時にパフォーマンスボトルネックを特定して削除する方法については、「起動とスケーリングの速度の向上」をご参照ください。
