Flink CDC によるデータインジェスト ジョブに関するよくある質問 (FAQ) と解決策です。
クイックリファレンス
| 現象 | フェーズ | 重要度 | リンク |
|---|---|---|---|
SnapshotSplits メトリクス値が高い場合の JobManager の OOM (メモリ不足) |
スナップショット | 重大 | FAQ 1 |
| 残りのシャードが少ない場合の TaskManager の OOM (メモリ不足) | スナップショット | 重大 | FAQ 3 |
| インクリメンタル読み取り中のステートリカバリにおける JobManager の OOM (メモリ不足) | インクリメンタル | 重大 | FAQ 2 |
pt-osc によるロックフリーのスキーマ変更後に新しいデータがない |
スキーマ変更 | 高 | FAQ 4 |
| ロックフリーのスキーマ変更後の Transform での列タイプの不一致 | スキーマ変更 | 高 | FAQ 5 |
| スキーマ変更前のセーブポイントからのジョブのリストア失敗 | ステートリカバリ | 高 | FAQ 6 |
| スナップショットフェーズ中のバイナリログのパージによる同期失敗 | バイナリログの保持 | 高 | FAQ 7 |
スナップショットフェーズ
FAQ 1:スナップショットフェーズ中の JobManager の OOM (メモリ不足)
重要度:重大 | フェーズ:スナップショット | 影響を受けるバージョン:すべての VVR エンジンバージョン
現象
-
スナップショット フェーズ中にジョブが繰り返し再起動します。
-
JobManager のログに
OutOfMemoryError(OOM) のスタックトレースが含まれています。 -
[アラーム] タブで、
Num of remaining SnapshotSplitsとNum of processed SnapshotSplitsメトリックが、異常に高い値を示します。
原因
スナップショット フェーズ中、MySQL ソースはすべてのテーブル シャードのメタデータを Flink ジョブのステートに永続化します。ジョブが大量のデータを処理する場合や、非常に小さいシャード サイズを使用する場合、JobManager は過剰な数のシャードを作成し、利用可能なメモリを使い果たしてしまいます。
解決策
-
JobManager のメモリリソースを増やしてください。
-
次のパラメーターを調整して、JobManager のヒープメモリとオフヒープメモリを増やしてください。
-
jobmanager.memory.heap.size -
jobmanager.memory.off-heap.size
-
FAQ 3:スナップショットフェーズの終盤における TaskManager の OOM (メモリ不足)
重要度:重大 | フェーズ:スナップショット | 影響を受けるバージョン:すべての VVR エンジンバージョン
現象
-
スナップショット フェーズの後半、通常は少数のシャードのみが残っている時点で、TaskManager のメモリが不足します。
-
TaskManager ログで
using select statementを検索すると、最後の無制限のクエリが非常に大量のデータを含んでいることがわかります。
原因
スナップショット フェーズ中の長時間のデータ読み取りにより、インクリメンタル データが最後のシャードに蓄積されます。TaskManager がこれらの蓄積された大きなシャードを処理する際に、メモリ不足が発生します。
解決策
-
次のオプションを設定してください。
scan.incremental.snapshot.unbounded-chunk-first.enabled: true -
スナップショットを再実行してください。
インクリメンタルフェーズ
FAQ 2:インクリメンタルフェーズでのステートリカバリ中の JobManager の OOM (メモリ不足)
重要度:重大 | フェーズ:インクリメンタル | 影響を受けるバージョン:VVR 11.1 以前
現象
-
ジョブはインクリメンタル フェーズに入りますが、ステートリカバリ中に失敗します。
-
JobManager のログに OOM (メモリ不足) が記録されます。
原因
VVR 11.1 以前のバージョンでは、インクリメンタル フェーズへの移行後に、ジョブのステートから永続化されたテーブルスキーマ情報が適切にクリーンアップされない場合があります。この残されたスキーマ データが蓄積され、ジョブがチェックポイントからリストアする際に OOM (メモリ不足) を引き起こします。
解決策
-
VVR 11.2 以降にアップグレードしてください。
スキーマ変更
FAQ 4:pt-osc を使用したロックフリーのスキーマ変更後に新しいデータがない
重要度:高 | フェーズ:スキーマ変更 | 影響を受けるバージョン:VVR 11.1 以前
現象
-
ロックフリーのテーブルスキーマ変更後、ジョブは再起動せずに実行を継続します。
-
CurrentFetchTimeLagメトリクスは期待どおりに進み、データがフェッチされていることを示します。 -
MySQL ソースが新しいデータの生成を停止し、
CurrentEmitTimeLagメトリクスの更新が停止します。
原因
VVR 11.1 以前のバージョンでは、pt-osc などのロックフリーのスキーマ変更ツールによって生成された DDL イベントを正しく処理できないため、データパイプラインが停止します。
解決策
-
VVR 11.2 以降にアップグレードしてください。
-
次のオプションを設定してください。
scan.parse.online.schema.changes.enabled: true
FAQ 5:ロックフリーのスキーマ変更後の Transform での列タイプの不一致
重要度:高 | フェーズ:スキーマ変更 | 影響を受けるバージョン:VVR 11.1 以前
現象
-
ロックフリーのテーブルスキーマ変更 (たとえば
pt-oscを使用するなど) が行われると、ジョブが予期せず再起動します。 -
Transform オペレーターのログに、列タイプの不一致エラーが示されます。
原因
VVR 11.1 以前のバージョンでは、ロックフリーのスキーマ変更中に大量のデータがテーブルに挿入されると、エンジンが解析不能なイベントを生成する可能性があります。
解決策
-
VVR 11.2 以降にアップグレードしてください。
-
ロックフリーのスキーマ変更前に作成されたセーブポイントから、ステートフルな再起動を実行してください。
ステートリカバリ
FAQ 6:スキーマ変更前のセーブポイントからのジョブのリストア失敗
重要度:高 | フェーズ:ステートリカバリ | 影響を受けるバージョン:VVR 11.1 以前
現象
-
テーブルのスキーマ変更前に作成されたセーブポイントからのステートフルな再起動が失敗します。
-
エラーメッセージは、バイナリログを消費する際のテーブルスキーマの不一致例外を示します。
原因
VVR 11.1 以前のバージョンは、互換性のないテーブルスキーマを含むセーブポイントからのステートフルな再起動をサポートしていません。
解決策
-
VVR 11.2 以降にアップグレードしてください。
-
アップグレード後、スキーマ変更前のセーブポイントからジョブを再起動してください。
バイナリログの保持
FAQ 7:スナップショットフェーズ中のバイナリログのパージによる同期失敗
重要度:高 | フェーズ:スナップショット / インクリメンタル | 影響を受けるバージョン:すべての VVR エンジンバージョン
現象
-
Flink CDC ジョブがスナップショット フェーズ中に失敗し、必要なバイナリログの位置が存在しなくなったか、パージされたことを示すエラーが表示されます。
原因
Flink CDC ジョブは、異なるバイナリログ消費パターンを持つ 2 つの連続したフェーズで動作します。
-
スナップショットフェーズ:履歴データを読み取り、比較的古いバイナリログ エントリを再生します。スナップショット フェーズに時間がかかりすぎると、スナップショットが完了する前に、ジョブがまだ必要としているバイナリログ ファイルが MySQL によってパージされる可能性があります。これにより、必要なログの位置が利用できなくなるため、ジョブは失敗します。
-
インクリメンタルフェーズ:最新のバイナリログ エントリをほぼリアルタイムで読み取ります。インクリメンタル フェーズは常に最新のログ位置を追跡するため、通常、標準のバイナリログ パージポリシーの影響を受けません。
解決策
-
ジョブが現在スナップショットフェーズと増分フェーズのどちらにあるかを確認するには、ジョブモニタリングメトリック (たとえば、
Num of remaining SnapshotSplitsメトリック。値が 0 より大きい場合は、ジョブがまだスナップショットフェーズにあることを示します) を確認します。 -
バイナリログのパージが原因でスナップショット フェーズでジョブが失敗した場合は、次のいずれかまたは両方を実行してください。
-
バイナリログの保持期間を延長する:MySQL インスタンスで、想定されるスナップショット期間をカバーするようにバイナリログの保持期間を延長してください。
-
MySQL 5.7 以前では、
expire_logs_daysを十分な日数に設定します。 -
MySQL 8.0 以降:
binlog_expire_logs_secondsを十分な秒数に設定します。
-
-
スナップショット期間を短縮する:ステートレスな再起動を実行し、ジョブの並列度を上げることで、スナップショット期間を短縮してください。並列度が高いほどスナップショット フェーズが高速化され、バイナリログがパージされる可能性のある期間が短縮されます。
-