💰

BigQueryのコストを50%削減した話

に公開

はじめに

WED株式会社でデータエンジニアをしているryuya-matsunawaです。

こちらの記事で紹介されたBigQueryコスト削減の取り組みの別アプローチとして、BigQueryのコストを50%削減した話をします。

やったこと

  1. BigQueryのINFORMATION_SCHEMAを使って、クエリの実行時間やスキャンバイト数を取得
  2. 実行元ごとにクエリのコストが高くなる原因を調査および改善
  3. 改善後のコストをMetabaseで可視化

1. BigQueryのINFORMATION_SCHEMAを使って、クエリの実行時間やスキャンバイト数を取得

BigQueryのINFORMATION_SCHEMAを使って、クエリの実行時間やスキャンバイト数を取得することができます。
なお、INFORMATION_SCHEMAで確認できるクエリ履歴は最大で約6か月(180日)までしか保持されないため、長期的な分析ができるよう、BigQuery内に別テーブルを作成して履歴を保存する仕組みを整えました。

こちらの記事を参考に、クエリの実行時間やスキャンバイト数を取得するSQLを作成しました。

SELECT
  job_id,
  parent_job_id,
  user_email,
  statement_type as query_type,
  query,
  total_bytes_billed,
  ROUND(total_bytes_billed / POW(1024, 4) * 6.25, 4) as charges_doller,
  total_slot_ms,
  SAFE_DIVIDE(total_slot_ms, timestamp_diff(end_time, creation_time, millisecond)) as avg_usage_slots,
  datetime(creation_time, 'Asia/Tokyo') as execute_date,
  timestamp_diff(end_time, creation_time, millisecond) as execute_time
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  job_type = 'QUERY'
  and date(creation_time, 'Asia/Tokyo') >= current_date() - 1
ORDER BY
  creation_time desc

このクエリは日次で実行し、結果をBigQuery内の別テーブルに蓄積しています。

2. 実行元ごとにクエリのコストが高くなる原因の調査および改善

次に、実行元ごとにコスト増加の原因を調査しました。
まず、user_emailだけでは細かすぎるため、より大きな単位でグループ化するカラムを追加しています。

  • BigQuery
  • Metabase
  • Airflow
  • スプレッドシート
  • その他

例えば、スプレッドシートでは、他チームが作成したものにBigQueryが連携されており、日次で自動実行されるクエリが、不要になった後も実行され続けていました。
これらは実行元を特定して停止し、コスト削減につなげました。

また、古いクエリの中にはパーティションを指定していないものや、クエリ最適化が不十分なものも見つかりました。こちらも実行元を特定し、クエリの見直し・最適化を行うことでコストを抑えることができました。

3. 改善後のコストをMetabaseで可視化

改善後のコストは、Metabaseを使って可視化しました。
クエリの実行時間とスキャンバイト数を指標に、ダッシュボード上で状況を確認できるようにしています。

Metabaseのダッシュボードは以下のようなものです。

2月からコスト削減の取り組みを始め、徐々にコストが削減されていることがわかります。

まとめ

クエリ履歴の可視化からスタートし、実行元ごとの原因分析と改善を行った結果、BigQueryのコストを約50%削減することができました。

以前からクエリ履歴の記録はしていたものの、ようやく本格的に改善へ動き出すことができました。

特に、Spread Sheetからの不要なクエリの削減や、クエリの最適化は大きな効果がありました。

まだ手を付けられていないクエリもあるため、今後も継続的にコスト最適化に取り組んでいきます。

GitHubで編集を提案
WED Engineering Blog

Discussion