メインコンテンツまでスキップ
に最終更新

変更データと増分消費の概要

バージョン 5.0 以降、Doris は内部テーブルの行単位の変更を changelog に記録できます。記録された変更は、次の方法で読み取れます。

  • Table Stream: 消費した位置を記憶する、名前付きの消費オブジェクトです。読み取りのたびに前回の消費以降の変更だけを返し、変更の読み取りと対象テーブルへの書き込みを単一のトランザクションで実行します。
  • 増分クエリ(@incr): オブジェクトを作成する必要はありません。指定した時間範囲内のテーブルの変更を読み取ります。

非同期マテリアライズドビューでは、さらに上位の機能である Incremental View Maintenance (IVM) も利用できます。IVM は Doris に内部 Table Stream を自動管理させ、行単位の変更に基づいてマテリアライズドビューを維持します。マテリアライズドビューを維持する場合は、自分で Stream を作成して消費する代わりに、IVM を直接使用してください。

実験的な機能

この機能はバージョン 5.0.0 から利用できます。実験的な機能であり、デフォルトでは無効です。有効にする方法は前提条件を参照してください。

解決できる課題​

Doris 内での増分処理では、通常、次のような課題があります。

課題変更レコードがない場合changelog がある場合
下流側が増分データを必要としていても取得できない上流テーブルで毎日多くの更新や削除が発生するため、下流のレポート、ワイドテーブル、集計テーブルは全件再計算するか、アプリケーションが管理する update_time カラムに頼るしかありませんTable Stream は前回と今回の消費の間に発生した変更だけを返すため、下流側は増分データを処理できます
更新や削除を把握できないUnique Key テーブルの更新では古い値が上書きされ、削除された行は単に消えるため、後から何が変更または削除されたかを知ることができません各行の挿入、更新(更新前後の値を含む)、削除がすべて記録されます
複数のテーブルの増分データで時点がそろわない増分データをディメンションテーブルと結合すると、ディメンションテーブルは「現在」の状態である一方、増分データは「過去のある期間」を対象としています<stream>@snapshot() は、消費オフセットに対応する時点のディメンションテーブルのイメージを読み取ります

changelog は、各行の挿入、更新(更新前後の値を含む)、削除を、グローバルに単調増加するコミットタイムスタンプとともに記録します。Table Stream と増分クエリは、それぞれ異なる方法でこれらのレコードを読み取ります。

二つのレイヤー​

増分消費の二つのレイヤー。changelog が Table Stream と増分クエリに変更を提供する

機能必要なオブジェクト位置の管理者適した用途
Table StreamCREATE STREAM が必要Doris がパーティションごとに消費オフセットを保持継続的な増分 ETL、下流との同期、exactly-once の消費
増分クエリ @incr作成するオブジェクトなし利用者が時間範囲を指定アドホック分析、位置を独自に管理する外部スケジューラ

IVM はこれら二つのレイヤーの上に位置します。changelog に記録された変更と、Doris が自動作成する内部 Table Stream を使用しますが、ユーザーが操作する入口は CREATE MATERIALIZED VIEW と REFRESH MATERIALIZED VIEW です。

典型的なシナリオ​

四つの典型的なシナリオで推奨される増分消費の方法

シナリオ推奨する方法動作参照先
下流テーブルへの増分同期min_delta タイプの Table Stream注文テーブルで毎日多くのステータス更新が発生する場合、min_delta タイプの Table Stream を作成し、INSERT INTO downstream SELECT ... FROM the orders stream を定期的に実行します。各実行では、前回と今回の間の正味の変更だけを処理します。対象には新規注文、ステータスが変わった注文(変更前後の値を含む)、削除された注文が含まれます。変更の読み取りと下流テーブルへの書き込みは単一のトランザクションで実行されます。失敗した場合は自動的にロールバックされるため、変更が飛ばされたり重複して消費されたりすることはありませんTable Stream の基本
追記のみのログとイベントテーブルappend_only タイプの Table Stream挿入だけが行われる明細テーブルから、新たに書き込まれた行だけを最小限のコストで取得します消費タイプ
変更の監査と再生detail タイプの Table Stream、または @incr の DETAIL モードすべての変更の完全な履歴が必要な場合は、消費オフセットまたは時間範囲に基づいて行単位の変更をエクスポートし、監査テーブルに保存します増分クエリ
増分データとディメンションテーブルの一貫した結合<stream>@snapshot()注文の変更を消費する際に users テーブルとの結合が必要な場合、users_stream@snapshot() は消費オフセットに対応する時点の users テーブルのイメージを読み取ります。これにより、新しい注文が古いユーザー情報と結合されることも、その逆もありませんスナップショットの読み取り

機能対応表​

テーブルモデル​

テーブルモデルChangelog更新前のイメージ利用できる変更タイプ
Duplicate Key対応非対応APPEND のみ
Unique Key (Merge-on-Write, without cluster key)対応対応(changelog.need_historical_value = true)APPEND / UPDATE_BEFORE / UPDATE_AFTER / DELETE
Unique Key (Merge-on-Read)非対応--
Aggregate Key非対応--

その他の制限(自動採番カラム、VARIANT カラム、スキーマ変更の対象範囲など)は、Changelog に記載されています。

消費タイプの選択​

必要なデータ選択するタイプ補足
新たに挿入された行のみappend_only更新と削除は出力されません。オーバーヘッドが最も小さいタイプです
前回と今回の消費の間におけるキーごとの正味の変更min_delta(デフォルト)同じキーに対する複数の変更は、一組の UPDATE_BEFORE と UPDATE_AFTER にまとめられます。挿入後に削除されたキーは出力されません
すべての変更の完全な記録detail行ごとに出力され、まとめられることはありません

min_delta と detail の UPDATE_BEFORE 行および DELETE 行には更新前のイメージが必要です。そのため、ベーステーブルは changelog.need_historical_value を有効にした MoW テーブルでなければなりません。

前提条件​

  1. バージョン: Doris 5.0.0 以降。

  2. FE の設定: fe.conf で次の二つの項目を有効にし、FE を再起動します(どちらも動的な設定ではありません)。

    enable_feature_changelog = true
    enable_table_stream = true

    enable_feature_changelog は changelog とコミットタイムスタンプ(TSO)の割り当てを制御します。enable_feature_binlog は CCR binlog のみを制御するため、ここでは不要です。enable_table_stream は Table Stream の DDL を制御します。無効の場合、Stream の作成は Table Stream is experimental. Please set enable_table_stream=true to enable it. というエラーで失敗します。

  3. テーブル作成時に changelog を有効化: Changelog を有効にできるのはテーブル作成時だけです。既存のテーブルで ALTER TABLE を使って有効にすることはできません。テーブルを再作成してデータを再ロードしてください。

  4. デプロイモード: Changelog と Table Stream は、ストレージとコンピュートの統合モード、およびコンピュートとストレージの分離モードの両方で動作します。@incr による増分クエリは、現時点では統合モードで使用してください。分離モードへの対応は現在進められています。

書き込み時のオーバーヘッド

changelog を有効にすると、書き込みのたびに変更レコードの生成と永続化も行われ、MoW テーブルでは古い値の読み取りも必要になります。そのため、データロードのスループットが目に見えて低下します。増分消費が本当に必要なテーブルでのみ有効にし、本番環境に導入する前に実際のワークロードに近い条件で評価してください。

よくある質問​

質問回答
既存のテーブルで changelog を有効にできますか?できません。Changelog を有効にできるのはテーブル作成時だけです。changelog を有効にした新しいテーブルを作成し、データを再ロードしてください。詳しくは Changelog を参照してください
Table Stream と @incr のどちらを使うべきですか?exactly-once の消費が必要な継続的な増分 ETL には Table Stream を使用します。アドホック分析、過去の一定期間の変更の確認、または位置を独自に管理している外部システムには @incr を使用します。詳しくは Table Stream との違い を参照してください
Stream の作成時に Table Stream is experimental. Please set enable_table_stream=true to enable it. というエラーが出ますFE で enable_table_stream が有効になっていません。fe.conf を更新して FE を再起動してください
コンピュートとストレージの分離モードでも動作しますか?Changelog と Table Stream は動作します。@incr は現時点ではストレージとコンピュートの統合モードで使用してください
changelog は書き込みにどう影響しますか?書き込みのたびに変更レコードの生成と永続化も行われ、MoW テーブルでは古い値も読み取るため、データロードのスループットが目に見えて低下します。増分消費が必要なテーブルでのみ有効にし、実際のワークロードに近い条件で評価してください
変更レコードは自動的に削除されますか?はい。changelog.ttl_seconds が保持期間を制御します(デフォルトは一日)。増分読み取りでは期限切れのレコードが除外され、バックグラウンドの compaction によって使用領域が回収されます。保持期間内に変更を消費してください。詳しくは 保持とクリーンアップ を参照してください

関連ドキュメント​

ページ内容
クイックスタートテーブルの作成、Stream の作成、データの書き込み、変更の確認、消費を 10 分で体験する手順
Changelog有効化の方法、プロパティ、対応範囲、変更レコードのモデル、DDL の制限、オーバーヘッド、トラブルシューティング
増分クエリ@incr による時間範囲を指定したクエリと、三つの増分モード
Table Stream の基本Stream の作成と管理、三つの消費タイプ、初期行、読み取りと消費の違い、仮想カラム
Table Stream の高度な機能パーティション単位のオフセット、スナップショットとリセット、一貫した結合、同時消費、ベーステーブルの変更による影響、監視と復旧
Incremental View Maintenance (IVM)changelog と内部 Table Stream を使用して、非同期マテリアライズドビューを行単位で維持する方法