Pinterestの次世代DB取り込みフレームワークにおけるパーティションの最終化
この投稿では、Pinterestの新しいデータベース取り込みフレームワークにおいて、データがダウンストリームでの利用に十分なほど完全である時期を決定するためのソリューションを紹介します。Kafka、Flink、Icebergなどのテクノロジーに基づいて構築されたこのフレームワークは、データを継続的に処理するため、以前は単一実行のバッチジョブに依存して最終化を行っていたバッチジョブにとって課題となります。時間パーティション化されたデータは、時間列によってグループ化され、コンシューマーがテーブル全体をスキャンすることなく特定のセグメントを読み取ることができます。バッチシステムでは、プロデューサーが書き込みを完了するとパーティションは最終と見なされていましたが、ストリーミングフレームワークはパーティションに継続的に書き込むため、従来の最終化は困難です。この問題に対処するため、PinterestはFlink-to-Icebergシンク内にイベント時間ベースのパーティション最終化メカニズムを開発しました。このシステムは、レコードからイベント時間を抽出し、Flinkのチェックポイント間で最小および最大イベント時間などの統計を収集し、これらをIcebergのスナップショットサマリーに保存します。その後、アルゴリズムがこれらの統計を使用してウォーターマークを生成し、パーティションが完全と見なされる時点を示し、それが常に増加することを保証します。このウォーターマークはIcebergテーブルプロパティとして保存され、ダウンストリームジョブが処理トリガーのためにそれをクエリできるようにします。このメカニズムは、アップサートジョブによってベーステーブルに伝播され、シグナルがデータとともに伝わることを保証します。この実装は、拡張可能なIceberg-Flinkシンク機能を活用しています。アキュムレーターはライターサブタスクでレコード統計を収集し、コミットプロセッサーはIcebergコミットの前後にカスタムロジックを実行します。この設計により、拡張機能が設定されていない場合はオーバーヘッドがゼロになり、パーティション最終化がストリーミングデータパイプラインに効率的に統合されます。