Pub/SubのBigQueryサブスクリプションの書き込みレイテンシを計測する
概要
Pub/SubからBigQueryに直接ストリーミングインサート可能なBigQueryサブスクリプションの書き込みレイテンシを計測したので、計測方法と結果を残します。
BigQueryサブスクリプションとは
メッセージキューであるPub/SubからBigQueryに直接データをストリーミングインサートできるサービスです。
このサービスを使うことで、DataflowやCloud Runなどのサブスクライバーを挟まないシンプルな構成のストリーミングデータパイプラインを構築可能です。
間にサブスクライバーを挟まないので、生データをそのままBigQueryに書き込むことしかできません。
計測対象
今回の計測対象は、Pub/SubのBigQueryサブスクリプションからBigQueryへ書き込まれるまでです。
データソースで、データが発生してからBigQueryへ書き込まれるまでの時間ではありません。
計測方法
BigQueryサブスクリプションの書き込みレイテンシは、サブスクリプションからデータが配信された時刻とBigQueryにデータが書き込まれた時刻の差分を計算することで求められます。
サブスクリプションからデータが配信された時刻
BigQueryサブスクリプションからデータが配信された時刻は、サブスクリプション作成時に「メタデータを書き込む」オプションを選択することで計測できます。
「メタデータを書き込む」オプションを選択すると、いくつかのメタデータが記録されるのですが、その中の1つであるpublish_time(メッセージのパブリッシュ時刻)が今回の対象です。
BigQueryにデータが書き込まれた時刻
BigQueryにデータが書き込まれた時刻は、データを書き込むテーブルにTIMESATMP型のカラムをあらかじめ作っておき、そのカラムのデフォルト値をCURRENT_TIMESTAMPにすることで、テーブルに書き込まれた時刻が計測できます。
実際に計測してみる
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サブスクリプションは十分使えるのではないでしょうか。
参考
Discussion