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プロジェクト
スロットを増やしたい場合は、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>
サービスアカウントキーの認証
ジョブの実行前にコンテナに環境変数としてサービスアカウントキーを渡し、認証させます。
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