すべてのプロダクト
Search
ドキュメントセンター

Realtime Compute for Apache Flink:Datastream API を使用して逆圧を軽減するための状態サイズの制御

最終更新日:Jan 07, 2025

状態管理は、パフォーマンス、安定性、およびリソース使用率に影響します。不適切な状態管理は、システムクラッシュにつながる可能性があります。Datastream API を使用すると、柔軟な方法で状態サイズを管理できます。このトピックでは、Datastream API で構築されたデプロイメントの状態サイズを制御する方法について説明します。

背景情報

Apache Flink は、オペレーター状態とキー付き状態の 2 種類の状態をサポートしています。キー付き状態を使用すると、状態サイズが大きくなる可能性が高くなります。この問題に対処するために、ValueState、ListState、MapState インターフェースなどの DataStream API を使用して、キー付き状態を管理できます。また、状態の有効期限 (TTL) を設定して、状態データを期限切れにすることもできます。詳細については、「キー付き状態の使用」をご参照ください。

診断ツール

逆圧は、Apache Flink のパフォーマンスボトルネックの指標です。ほとんどの場合、逆圧は、状態サイズが継続的に増加し、割り当てられたメモリサイズを超えたために発生します。この場合、状態バックエンドは、使用頻度の低い状態データをディスクストレージに移動します。ただし、ディスクストレージ内のデータへのアクセスは、メモリ内のデータへのアクセスよりも大幅に遅くなります。オペレーターがディスクから状態データを頻繁に読み取る場合、データレイテンシが大幅に増加します。これにより、パフォーマンスボトルネックが発生します。

逆圧が状態サイズの肥大化によって引き起こされているかどうかを特定するには、デプロイメントとオペレーターの実行状態を徹底的に分析する必要があります。監視ツールと診断ツールを使用して、状態アクセスによって引き起こされるパフォーマンスの問題を特定し、解決できます。

Realtime Compute for Apache Flink の開発コンソール の診断ツールを次の表に示します。これらのツールをインテリジェントデプロイメント診断機能および自動チューニング機能と組み合わせて使用することで、状態の大きいデプロイメントのパフォーマンスチューニングを容易にすることができます。

スレッドアクティビティフレームグラフ

ツール

説明

使用方法

スレッドダンプ

オペレータースレッドが現在、主に状態データにアクセスしているかどうかを確認します。

詳細については、「デプロイメントのパフォーマンスの監視」をご参照ください。

特定の期間中に、オペレータースレッドが主に状態データにアクセスしているかどうかを確認します。

特定の期間中に、CPU 時間の大部分が状態データへのアクセスに使用されているかどうかを確認します。

ランタイムメトリクスの監視

関連するメトリクスを表示して、状態サイズと I/O オーバーヘッドを確認します。

[デプロイメント] ページで表示するデプロイメントをクリックし、[ステータス] タブをクリックして、[アクション] セクションの [メトリクス] をクリックします。

image

次のメトリクスを表示できます。

  • 状態サイズ: 各サブタスクの状態サイズ。このメトリクスは、GeminiStateBackend を使用している場合にのみ使用できます。

  • LastCheckPointFullSize: 最新のチェックポイントのフルサイズ。このメトリクスは、デプロイメント全体の状態サイズを推定するのに役立ちます。

  • 状態アクセスレイテンシに関連するメトリクス: これらのメトリクスのいずれかがミリ秒レベルに達すると、状態アクセスによってパフォーマンスが低下する可能性があります。詳細については、「状態」をご参照ください。

チューニング方法

アプリケーション設計の再評価

アプリケーションにおける状態ストレージと管理の設計は非常に重要です。状態の無制限の増加を防ぐために、必要な情報のみを状態に保存します。

TTL を構成することで状態サイズを削減できます

Apache Flink は、状態データのライフサイクルを管理するのに役立つさまざまな方法を提供しています。たとえば、ValueStateDescriptor インターフェースの setTTL() メソッドを呼び出して、状態データを自動的に期限切れにしてクリアできます。また、clear() メソッドと remove() メソッドを呼び出して、不要になったレコードの状態データを削除することもできます。これは、状態サイズを制御するのに役立ちます。

タイマーを使用して状態をクリーンアップする

タイマーを使用して、状態のクリーンアップを定期的にトリガーできます。これにより、期限切れの状態データがタイムリーに削除され、状態の無制限の増加を防ぎます。さらに、状態データのライフサイクルをきめ細かく管理できます。

パフォーマンスの監視、ログの生成、および状態ファイルの分析

状態サイズと状態バックエンドに関連するパフォーマンスメトリクスを監視して、例外をタイムリーに検出します。トラブルシューティングを容易にするために、詳細なログを生成します。履歴状態ファイルを定期的に分析して、パターンと潜在的なリスクを特定し、この情報を使用して状態管理を最適化します。

ディスク読み取りを最小限に抑える

ディスク読み取りの回数を減らし、メモリの割り当てを最適化して、システムパフォーマンスを向上させます。

  • メモリの割り当てを最適化する

    システム全体のリソースに影響を与えることなく、マネージドメモリにより多くのリソースを割り当てます。これにより、メモリ使用率が効果的に向上し、ディスクへのアクセスが削減されます。この方法を使用する前に、システムの他の部分に十分なメモリリソースがあることを確認してください。

  • メモリリソースを追加する

    メモリリソースを追加し、状態ストレージエンジンにより多くのマネージドメモリを割り当てます。これにより、メモリ使用率が向上し、ディスクへのアクセスが削減されます。リソース設定のエキスパートモードでこの方法を使用して、きめ細かいリソース割り当てを実装し、最適なパフォーマンスを実現できます。

  • 並列度を高める

    並列度が高いほど、各サブタスクの状態サイズが小さくなり、ディスクに書き込まれるデータ量が減少します。この方法により、ディスク I/O 操作が効果的に削減され、データ処理効率が向上します。

次の表に、さまざまなシナリオで前述の方法を使用する方法を示します。

並列度を高めます。

シナリオ

方法

操作

注意事項

ヒープメモリなどの他のメモリリソースが十分にある

マネージドメモリにより多くのリソースを割り当てます。

taskmanager.memory.managed.fraction パラメーターを設定します。デフォルト値は 0.4 です。値が大きいほど、状態ストレージに割り当てられるマネージドメモリの割合が大きくなります。詳細については、「メモリの構成」および「実行中のデプロイメントのパラメーターを設定する方法」をご参照ください。

他のメモリリソースが十分にあることを確認してください。そうでない場合、フルガベージコレクション (Full GC) が頻繁に発生し、パフォーマンスが低下する可能性があります。

すべてのシナリオ

メモリリソースを追加します。

詳細については、「デプロイメントのリソースを設定する」をご参照ください。

該当なし

参照