Datastreamの接続先BigQueryテーブルをパーティショニングする

目次

こんにちは。
データ分析基盤チームリーダーのT.Y.です。
私達のチームでは、RDB等のデータソースからBigQueryに連携させてデータウェアハウスやデータマートを構築しています。
今回、RDBからBigQueryにDatastreamを用いて連携しているテーブルを、パーティショニングした事例を紹介します。


背景

以前の記事にて紹介した通り、当社でのCloud SQLからBigQueryへの接続にはDatastreamを利用しています。

構成について記述している以前の記事はこちらです。

本構成の中でDatastreamを利用して接続しているテーブルには様々な種類があります。

その中でも、日次で数万レコードが追加され、1億弱のレコードがあるような当社比でサイズが大きなテーブルの利用頻度が高い状態でした。
このテーブルを、Looker Studioに接続するなどして可視化した際に、クエリ実行した際のコストの高さが課題でした。
テーブルには10年ほどのデータが記録されている一方、高頻度で分析に利用するのは直近1年以内のデータであり、当然テーブルのパーティショニングを検討することとなります。


まずはドキュメントを読んで実装しました

Google Cloud公式のドキュメントは以下です。

「Datastream を使用して BigQuery のパーティション分割テーブルにデータを取り込む」https://cloud.google.com/datastream/docs/best-practices-partitioned-tables

本記事を記述する以前に、このドキュメントを見ながら実装しました。

テーブルのパーティショニングはでき、コンソール画面では確かにDAY単位でパーティショニングできている表示となりました。

ところが、このテーブルに対してクエリを実行したところ、想定していたクエリコスト削減が実現できていませんでした。
パーティショニングで指定したカラムの条件を指定することで、捜査範囲が絞られる(プルーニングされる)想定でしたが、そうはならなかったのです。

(参考)プルーニングについて
https://cloud.google.com/bigquery/docs/querying-partitioned-tables


実行グラフにおける読み取り元テーブルとmax_stalenessオプションの設定

インターネット上の先駆者や、Google Cloud コミュニティ内の記事も探してみたものの、解決に至る決定的な内容にはなかなか出会えませんでした。
それでも、何か解決策がないかプルーニングされないクエリの結果を実行グラフから確認すると、怪しそうな点が見えてきました。

実行グラフでは、DELTA_CDC_TABLE_{テーブル名} テーブルからデータを読み取っていたのです。
このテーブルは、名前から推測するにCDCの変更差分であり、パーティショニングしたテーブルから読み取っていません。
このDELTAテーブルに最新の変更が記録されているのでしょう。

パーティショニング設定をしていないテーブルでは、DELTA_CDCテーブルではなく、作成したテーブルから読み取っていました。
どうやら、常に最新の変更を取得している、ということが分かりました。

Datastreamでは、更新頻度を設定していたのに、おかしそうだ、と気付いた私は、以下のドキュメントにたどり着きました。
https://cloud.google.com/bigquery/docs/change-data-capture

そして、テーブルを確認するとこのドキュメントにて言及されている、max_stalenessオプションの指定がなされていなかったのです。

Datastreamの宛先追加によって自動でテーブルが作成される際には、Datastreamにて設定したmax_staleness オプションの値がBigQueryのテーブルに適用されます。
しかし、Datastreamの連携前に事前にテーブルを作成した場合、後から宛先追加をしてもmax_stalenessオプションの設定が入らないようです。

以下のクエリで、max_stalenessオプションを設定すると、読み取り元がパーティショニングしたテーブルに変わり、クエリコストも大きく下がりました。

ALTER TABLE {table_name}

SET OPTIONS (

  max_staleness = INTERVAL 15 MINUTE);

まとめ

今回の記事と同様の内容を試みた記事はいくつかありましたが、Datastreamのみでクエリ実行時のプルーニングまで実現できている例がなかったため苦戦しました。
Datastreamは、サービス開始からまだ3年ほどであり、課題の解決事例もまだ多いとは言えません。
しかし、RDBからBigQueryへのデータ連携実現のためには、上位の選択肢に入ると思います。
当社では、引き続きDatastreamを活用しながら、MySQLとBigQueryとの連携を進める予定です。

レイスシステムソリューションズ株式会社のソフトウェア開発や、
採用に関するお問い合わせについては、下記のリンクにてお問い合わせください。

お問い合わせ