投稿者:中根

日本情報通信の中根です。

7 月 25 日に実装された Pub/Sub の BigQuery Subscriptions を試したいと思います。

これはなに?

8 月 4 日 現在日本語ドキュメントはまだ無いようです。
機能として BigQuery サブスクリプションが追加されました。

image-001.jpg

従来ですと Dataflow や Cloud Functions 等で BigQuery へ書き込むサブスクライバーを用意する必要がありました。
こちらを使うことでトピックのメッセージを BigQuery Subscriptions を利用することで Pub/Sub から直接 BigQuery へ書き込む事ができます。
利用コンポーネントを減らしコストや運用負荷の低下が期待できるでしょう。

試してみる

それでは試してみましょう。

事前準備

Pub/Sub のサービスアカウントservice-<PROJECT_NUMBER>@gcp-sa-pubsub.iam.gserviceaccount.comに対して下記のロールを付与する必要があります。

  • BigQuery データ編集者
  • BigQuery メタデータ閲覧者

サブスクリプションの作成

コンソールにて行ってみましょう。

image-002.png

配信タイプに「Write to BigQuery」があります。
これを選択すると書き込み先の BigQuery テーブルを指定できます。
また 3 つのチェックボックスがあります。

  • トピックスキーマを使用する
  • メタデータを書き込む
  • 不明な項目を削除する

それぞれ日本語の説明が付与されています。
この設定により書き込むテーブルのスキーマが異なります。

どれも指定しない場合はdataという STRING もしくは BYTES 型のカラムが必須となります。
「メタデータを書き込む」をチェックした場合は更に下記のようなカラムが必要となります。

カラム名 タイプ 説明
subscription_name STRING サブスクリプション名
message_id STRING メッセージ ID
publish_time TIMESTAMP メッセージがパブリッシュされた時間
data STRING or BYTES 必須カラム
attributes STRING メッセージの属性を持つ JSON オブジェクト

トピックスキーマを使用するはPub/Sub のトピックスキーマに準じたスキーマのテーブルが必要となります。
スキーマの互換性を確認しつつテーブルを用意しましょう。

image-003.jpg

BigQuery Subscriptions は Push 型のため Exactly Once は使えないようです。
メタデータを有効にした場合 message_id が付与されるのでこちらで重複排除することも代替案となるでしょう。

サブスクリプションの作成自体は作成ボタンを押してから 10 数秒で完了します。
非常にシンプルです。

確認

今回 Twitter の情報を定期的にパブリッシュしているトピックにサブスクリプションを作成してみました。
トピックスキーマは利用せずメタデータを書き込む設定にして見ました。

image-004.jpg

プレビュー画面にて確認してみましたがデータがしっかり入っています。

image-005.jpg

料金

この BigQuery Subscriptions ですがコストはどれくらいでしょうか。
ドキュメントによると$50/TiBとのことです。
10GiB までは無料枠が用意されているのでデータサイズによりますが手軽に試せると思います。

まとめ

いかがでしたでしょうか。
Pub/Sub へパブリッシュしたデータを BigQuery にインサートする作業が従来よりかなりシンプルになったかと思います。
コンソールからの作業で完結するため非常にとっつきやすくなったかと思います。

個人的には data カラムをプレビュー中の JSON 型が選べるようになると良いなと思いました。
もちろんトピックスキーマという選択肢もあるのですがトピック作成後にスキーマを更新できない現在の仕様は少し使いづらいです。
BigQuery の JSON 型で直接インサートできるとその後の処理に対する柔軟性がより一層上がると思うのでどこかでリクエストを上げてみたいと思います。

現在何かしらのサービスで Pub/Sub から BigQuery へ書き込みの処理を実装されている場合はまず検証してみることをおすすめします。
処理やデータ量によりますが軽めの処理であればまず間違いなく BigQuery Subscriptions のほうがシンプルになるかと思います。
ぜひ皆さんも試してみてはいかがでしょうか。