atama plus techblog
💸

Datastreamを使い始めたら想定以上に金額がかかったのでなんとかした

2024/08/27に公開

基盤を移行したら転送料金が想定のN倍になる事象が発生

atama plusでは、データ基盤進化の一環でデータ基盤の移行を実施しました。

移行についての詳細な事例は以下のリンクから確認できます。

データ基盤を移行した際、BigQueryのコストが予想外に膨れ上がる事象が発生しました。
このコスト上昇は、予算レポートを通じて検知されました。以下に、転送コストを1/4に削減するために行った具体的な対策を紹介します。

転送コストを1/4にするためにやったこと

1. コストがかかっているポイントの特定

コストレポートを確認すると、特定サービスアカウントによるBigQueryのanalyze処理にコストがかかっていることを特定しました。

具体的には、bigquery-adminbot@system.gserviceaccount.com というサービスアカウントのanalyze処理にコストがかかっていることがわかりました。

BigQuery Monitorの画面

このサービスアカウントにより、BigQueryにupsertが行われることがドキュメントに記載されています。

Datastreamによるデータ転送設定の中で設定できる max_staleness という値に基づいて、DatastreamはBigQueryのテーブルを更新することになります。
そこで、この値を変更してコストを削減する方法を模索しました。

2. 同期間隔を一括で変更する

前述の通り、 max_staleness はDatastreamの転送設定の中で設定できます。
しかし、このパラメータは、Datastreamにより新規に作成されるテーブルにしか設定されないため、既存のテーブルに対しては変更操作が必要でした。

Datastreamによってすでに作成されているテーブルに対しては、直接クエリを実行することでこの値を変更する必要があります。

ALTER TABLE employees
SET OPTIONS (
  max_staleness = INTERVAL 60 MINUTE);

これを200を超えるテーブルに対して逐次実施するのは効率が悪いため、スクリプトを作成して一括で変更を実施しました。

#!/bin/bash

# Set your project ID and dataset IDs
PROJECT_ID="PROJECT_NAME"
DATASETS=(
  "DATASET_1"
  "DATASET_2"
  "DATASET_3"
)

# Iterate over each dataset
for DATASET_ID in "${DATASETS[@]}"; do
  echo "Processing dataset: $DATASET_ID"

  # Get the list of all tables in the dataset
  TABLES=$(bq ls --project_id=$PROJECT_ID --max_results=1000 $DATASET_ID | awk 'NR>2 {print $1}')

  # Iterate over each table and run the ALTER TABLE command
  for TABLE in $TABLES; do
    echo "Altering table: $TABLE in dataset: $DATASET_ID"
    bq query --use_legacy_sql=false --project_id=$PROJECT_ID "
    ALTER TABLE \`$PROJECT_ID.$DATASET_ID.$TABLE\`
    SET OPTIONS (
      max_staleness = INTERVAL 60 MINUTE
    );"
  done
done

3. 影響のモニタリング

その後、数日間コストレポートをモニタリングし、BigQueryのコストが最大時の1/4程度に圧縮されていることを確認しました。
max_staleness を15minから60minに広げているので、リニアに影響が出ていることがわかります。

cost report

余談:効果がなかったこと

Dataformにより毎日view定義を更新している処理にコストがかかっているという仮説を立て、一度作成したviewの更新を日次で行わないようにしましたが、コスト効果はありませんでした。
viewは参照時にコストがかかるが作成時にはコストがかからないため、これは仕様通りの結果でした。

成果と今後の課題

データ基盤移行後、コストをモニタリングしていたことで意図しないコスト上昇に気づくことができました。
コストがかかっているポイントを特定し、適切な対応を取ることでコストを圧縮できました。

今後の課題としては、テーブル単位で更新頻度を可変にする、BigQueryの料金プランを調整するなど、さらなる最適化を目指していきます。

We're hiring!

atama plusは教育を一緒にテクノロジーで解決していけるエンジニアを探しています!
興味があればぜひご応募ください!
https://herp.careers/v1/atamaplus

atama plus techblog
atama plus techblog

Discussion