BigQueryのスロットの購入・予約・割り当てをSQLだけで実施する

Flex Slotsの容量コミットメントの購入、スロットの予約、予約のプロジェクトへの割り当て、という一連の作業をSQLだけで実行する。
2022.07.08

データアナリティクス事業本部、池田です。東京暑いです。
以前のブログでBigQuery Omni を使用したのですが、Omniはフラットレート(定額)料金であることが必須でした。 2020年にFlex slotsが利用可能 になったので、フラットレートは使いやすくなったのではないかと思います。

今回はあえてSQLだけでFlex slotsを設定してみたいと思います。

関連する用語

正確なところはリンク先の公式ドキュメントをご覧下さい。

オンデマンド料金

クエリでスキャンされたデータに対して料金が発生

フラットレート料金

定額料金プラン

専用のクエリ処理容量(BigQueryスロットの割り当て数)を購入

スロット

BigQueryでSQLクエリを実行するために使用される仮想CPU

容量コミットメント
フラットレート料金用のスロットを購入することと理解しています。。。たぶん。

Flex Slots

指定した数のスロットの料金を 60 秒間支払い、その後はコミットメントを削除するか、別のタイプのコミットメント プラン(月単位または年間)に変更するまで秒単位で課金

予約

リソースの独立したプール

購入したスロットを用途などの単位で分けることだと理解しています。。。たぶん。

割り当て

購入したスロットを使用するには、割り当てを作成して、プロジェクト、フォルダ、または組織をスロット予約に割り当てます。

フラットレートでクエリなどを処理するためには、 スロットの購入→予約の作成→割り当ての実施 という一連の流れが必要になります。

スロットの購入

スロット容量の購入と管理

BigQuery Reservations APIの有効化が必要です。

この章以降のSQLを実行するには、スロット関連の権限が必要になります。 ロールでいうと、 BigQuery Admin もしくは BigQuery Resource Admin 辺りが必要になります(オーナーでもOK)。

SQLやコンソールでも作業できないような場合は、権限周りか、 プロジェクトのクォータなどを確認すると良さそうです。

↑の場合は、100スロット以上の購入ができませんでした。


購入のSQLはこんな感じです。

CREATE CAPACITY `{プロジェクト名}.region-asia-northeast1.devio-flex-20220706`
AS JSON """{
    "slot_count": 100,
    "plan": "FLEX"
}""";

↑Flex Slotsで100スロット購入しました。
リージョンごとに購入が必要です。(今回は asia-northeast1

↓コンソール上だとこんな感じに見えます。「BigQuery」の「容量管理」の「スロットのコミットメント」タブから。


ちなみに、初めはBigQuery Omniで使用できる aws-us-east-1 リージョンで購入しようと思ったのですが、 以下のようなエラーでSQLではできませんでした。

BQ Omni Region aws-us-east-1 currently only supports flat rate slots. To continue running a query, please purchase a BQ Omni commitment and create a reservation.

aws-us-east-1ではFlex Slotsでないとおそらくクエリが発行できないので、 Flex Slotsの最初の購入はSQLではできなそうです。 →この場合はあきらめてコンソールなどから作業で。

予約の作成

スロット予約の操作

予約のSQLはこんな感じです。

CREATE RESERVATION `{プロジェクト名}.region-asia-northeast1.devio-blog`
AS JSON """{
    "slot_capacity": 50
}""";

↑購入した100スロットのうち、50スロットを予約しました。

↓コンソール上だとこんな感じ。「予約」タブから。

割り当ての実施

予約割り当てを使用する

割り当てのSQLはこんな感じです。

CREATE ASSIGNMENT `{プロジェクト名}.region-asia-northeast1.devio-blog.my-article`
AS JSON """{
    "assignee": "projects/{プロジェクト名}",
    "job_type": "QUERY"
}""";

プロジェクトでの asia-northeast1 のクエリ処理に対して割り当てを行いました。 (ジョブタイプについては こちら 。)

↓コンソール上だとこんな感じ。予約の作成の時と同じタブから。

予約割り当てを作成する場合は、5 分以上待ってからクエリを実行してください。それ以外の場合、クエリはオンデマンド料金で課金されます。

とのことなので、注意が必要そうです。

確認

設定完了後、適当なクエリを当該リージョンで実行してから、 「BigQuery」の「モニタリング」ページで確認してみます。

該当する予約でスロットが使われていることをグラフで確認できます。


利用が終わったら課金されないように、 必ずスロットのコミット(購入)を削除しましょう!

コミットの削除により、予約済みのスロット量を満たせなくなる場合は以下のようなエラーになります。

Error: Removing this capacity commitment with capacity (100) will result in not being able to satisfy slot requirements (50) of the reservations of project hogehoge. Please delete one or more reservations or reduce their slot count.

また、予約は紐づく割り当てを削除しないと削除できませんでした。
そのため今回の場合は、割り当て→予約→コミット(購入)の順で削除することになります。

おわりに

こういった操作までSQLでできてしまうのはすごいですね。
GUI以外でできることで、管理の自動化なども検討できそうです。

関連情報/参考にさせていただいたページ