🙄

Pub/SubのBigQueryサブスクリプションの書き込みレイテンシを計測する

2024/03/06に公開

概要

Pub/SubからBigQueryに直接ストリーミングインサート可能なBigQueryサブスクリプションの書き込みレイテンシを計測したので、計測方法と結果を残します。

BigQueryサブスクリプションとは

メッセージキューであるPub/SubからBigQueryに直接データをストリーミングインサートできるサービスです。

このサービスを使うことで、DataflowやCloud Runなどのサブスクライバーを挟まないシンプルな構成のストリーミングデータパイプラインを構築可能です。

間にサブスクライバーを挟まないので、生データをそのままBigQueryに書き込むことしかできません。

https://cloud.google.com/pubsub/docs/bigquery?hl=ja

計測対象

今回の計測対象は、Pub/SubのBigQueryサブスクリプションからBigQueryへ書き込まれるまでです。

データソースで、データが発生してからBigQueryへ書き込まれるまでの時間ではありません。

計測方法

BigQueryサブスクリプションの書き込みレイテンシは、サブスクリプションからデータが配信された時刻BigQueryにデータが書き込まれた時刻の差分を計算することで求められます。

サブスクリプションからデータが配信された時刻

BigQueryサブスクリプションからデータが配信された時刻は、サブスクリプション作成時に「メタデータを書き込む」オプションを選択することで計測できます。
「メタデータを書き込む」オプションを選択すると、いくつかのメタデータが記録されるのですが、その中の1つであるpublish_time(メッセージのパブリッシュ時刻)が今回の対象です。

https://cloud.google.com/pubsub/docs/create-bigquery-subscription?hl=ja#write-metadata

BigQueryにデータが書き込まれた時刻

BigQueryにデータが書き込まれた時刻は、データを書き込むテーブルにTIMESATMP型のカラムをあらかじめ作っておき、そのカラムのデフォルト値をCURRENT_TIMESTAMPにすることで、テーブルに書き込まれた時刻が計測できます。

https://cloud.google.com/bigquery/docs/default-values?hl=ja#set_default_values

実際に計測してみる

BigQueryテーブルの作成

まずは、データを書き込むBigQueryテーブルを下記SQLで作成します。

CREATE TABLE test.latency_measurement
(
  subscription_name	STRING OPTIONS(description="サブスクリプションの名前"),
  message_id STRING OPTIONS(description="メッセージのID"),
  publish_time TIMESTAMP OPTIONS(description="メッセージのパブリッシュ時刻"),
  data STRING OPTIONS(description="メッセージの本文"),
  attributes STRING OPTIONS(description="すべてのメッセージ属性を含むJSON オブジェクト"),
  insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP() OPTIONS(description="メッセージのBigQuery書き込み時刻")
)

insert_time以外の5カラムは、BigQueryサブスクリプションのメタデータを書き込むためのカラムです。

insert_timeカラムは、BigQueryの書き込み時刻を記録するのためのカラムで、デフォルト値が CURRENT_TIMESTAMP() になっているのがポイントです。

Pub/Subのサービスアカウントに権限付与

Pub/Subのサービスアカウントが、BigQueryにデータを書き込めるように、以下の2つのロールを付与します。

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

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

BigQueryサブスクリプションを下記画像のパラメータで作成します(見えないパラメータは、デフォルトのまま)。

トピックに指定した「projects/pubsub-public-data/topics/taxirides-realtime」は、Googleが一般公開しているNYのタクシーのデータがリアルタイムで送信されるトピックです。ストリーミングデータパイプラインの検証によく使われています。

「メタデータを書き込む」オプションは、忘れずに選択しましょう。

BigQueryサブスクリプションの作成と同時に、データがサブスクリプション内に取り込まれ、BigQueryに書き込まれます。

作成から1分で、約30万レコードがBigQueryに書き込まれました。

レイテンシの計算

サブスクリプションからデータが配信された時刻BigQueryにデータが書き込まれた時刻の2つがそろったので、レイテンシの計算を行います。

タイムスタンプの差分を計算する TIMESTAMP_DIFF() 関数を使った以下のクエリでレイテンシの平均を算出します。

WITH milli_second_latency AS (
  SELECT
    TIMESTAMP_DIFF(insert_time, publish_time, MILLISECOND) AS diff
  FROM
    `プロジェクト名.データセット名.latency_measurement`
)
SELECT AVG(diff) as average_latency FROM milli_second_latency

書き込みレイテンシ計測の結果は、平均561ミリ秒でした。

まとめ

BigQueryサブスクリプションで、Pub/SubからBigQueryに直接ストリーミングインサートした場合の書き込みレイテンシは、平均561ミリ秒と優秀でした。

リアルタイム性の要件が厳しいストリーミングデータパイプラインでも、BigQueryサブスクリプションは十分使えるのではないでしょうか。

参考

https://cloud.google.com/pubsub/docs/bigquery?hl=ja

Discussion