case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

BigQueryのFlex Slotsで柔軟にスロットを購入してジョブを制御する

BigQueryのFlex Slotsを試して見ました。バッチで重たいタスクの前にFlex Slotsを購入し、タスク完了後Flex Slotsを元に戻します。

BigQuery Flex Slotsについて

BigQueryの料金体系としてはオンデマンドと定額の2種類あります。定額の場合、これまではAnnuallyとMonthly単位でしかスロット(割り当て可能なサーバ)を購入することができなかったため、あまりコストメリットがないのが現状でした。
重たい処理の前にスロットが欲しいケースがあった場合でも、常時必要というわけではないからです。
今回、60秒単位でスロットを購入することができるようになる定額プラン(Flex Slots)ができたので、重たい処理の前にスロットを購入して、処理が終わったらスロットを下げるような柔軟な制御が可能になりました。
cloud.google.com

やりたいこと

スロット数をあげるときは、Commitmentでスロットを購入し、Reservationで適用するスロット数を更新(増や)します。スロット数を下げるときはReservationで適用するスロット数を更新(減ら)します。
事前にMonthlyで1000スロットを購入し、プロジェクトに割り振るアサイメントはコンソールから定義しているものとします。

実行コマンド

次のコマンドを実行して制御を行います。Monthlyの購入とAssignmentは事前にWEBコンソールから登録しておきます。
定額プランでスロットを購入する場合(BigQuery Reservations)、次の要素を意識する必要があります。

  • Commitment: 購入するスロット数
  • Reservation:購入ずみのスロットをどう割り振るか
  • Assignment:Reservationで分割したスロットを割り振るGCPプロジェクト

cloud.google.com

スロットを増やしたい場合は、Commitment→Reservation(2000)。減らしたい場合はReservation(1000)→Removementといった具合で制御します。

Commitment

Flex Slotsで1000スロット購入します。

bq mk --project_id=<admin_project_id> --location=US --capacity_commitment --plan=FLEX --slots=1000
Reservation

MonthlyとFlex合わせて2000スロットに修正し、事前にコンソールで定義したアサイメント対象のプロジェクトにスロットを割り当てます。

bq update --project_id=<admin_project_id> --location=US --slots=2000 --reservation <reservation name>
Removement

次のようにしてコミットメントID取得し、購入したFlex Slotsを削除します。

capacity_commitment_id=$(bq ls --capacity_commitment --location US --format prettyjson | jq 'map(select(.["plan"] | startswith("FLEX"))) | .[] | .name | split("/") | .[5]'| sed 's/"//g')
bq rm --project_id=<admin_project_id> --location=US --capacity_commitment <admin_project_id>:US.${capacity_commitment_id}

環境情報

権限

Reservation APIを有効化します。Owner権限が必要で権限がないとReservationが表示されません。
Introduction to Reservations  |  BigQuery  |  Google Cloud

BQコマンドの認証

ジョブの実行前にコンテナを立ち上げるため、初回実行となります。BQコマンドは初回実行時にプロジェクト等選ぶ必要があるため、省略するために設定ファイルを渡します。

# config/.bigqueryrc 
project_id = <admin_project_id>

Using the bq command-line tool  |  BigQuery  |  Google Cloud

サービスアカウントキーの認証

ジョブの実行前にコンテナに環境変数としてサービスアカウントキーを渡し、認証させます。
BQコマンドの認証に必要となる.bigqueryrcファイルは、環境によってはHOMEディレクトリが異なるため明示します。
Using the bq command-line tool  |  BigQuery  |  Google Cloud

# authorization
echo $GCP_CREDENTIAL > GCP_CREDENTIAL.json
gcloud auth activate-service-account --key-file=GCP_CREDENTIAL.json
export BIGQUERYRC=/root/.bigqueryrc
Dockerfile

Dockerfieは次のようになっています。

FROM google/cloud-sdk

RUN apt-get install jq -y
RUN mkdir -p /var/lib/gcloudsdk
WORKDIR /var/lib/gcloudsdk
COPY ./config/.bigqueryrc /root/
ENV ADMIN_PROJECT_ID <project id>


参考
plan=FLEX
https://medium.com/google-cloud/using-bigquery-flex-slots-to-run-machine-learning-workloads-more-efficiently-7fc7f400f7a7

Deleting capacity commitments
https://cloud.google.com/bigquery/docs/reservations-workload-management#deleting_capacity_commitments

capacity_commitment_id
https://cloud.google.com/bigquery/docs/information-schema-reservations?hl=hi