BigQueryクエリキューの概要まとめ
はじめに
こんにちは、クラウドエース データML ディビジョン所属の松山です。
データML ディビジョンでは、Google Cloudが提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。
新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。
用語
本ページで頻出する用語について、下表にまとめておきます。
用語 | 説明 |
---|---|
スロット | BigQueryのクエリを実行するために使用する仮想CPUのこと。 |
予約 | スロットを異なるワークロードまたは組織の異なる部分に割り当てること。 |
リリース内容
今回ご紹介するリリースは2023年7月28日付に一般提供(GA)されたBigQueryの「クエリキュー」という機能についてです。
クエリキューとは、BigQueryのスロットの予約に対して有効化できる機能のことです。
クエリキューが有効な場合、同時実行数(同時実行可能なクエリ数)を、使用可能なスロット数に基づく計算によって動的に自動決定できるようになります。
BigQueryの概要
BigQueryとは、Google Cloud が提供しているDWH(データウェアハウス)サービスの一つです。DWH(データウェアハウス)とは、データ分析に特化したデータベースのことを指します。BigQueryでは、SQLクエリを記述することによって、データ分析を実行できます。
BigQueryがサポートしているクエリの種類
BigQueryがサポートしているクエリは、以下の2種類です。デフォルトでは、インタラクティブクエリとして実行します。
- インタラクティブクエリ
可能な限り速やかに実行するクエリのこと。 - バッチクエリ
スロットが利用可能になったタイミングで実行するクエリのこと。
スロットに空きが出るまでの間、クエリはキューに格納されて保管されます。
詳細はインタラクティブクエリとバッチクエリを参照してください。
クエリキューの有効化方法
デフォルトではクエリキューの機能が無効になっているため、はじめに有効化の手続きが必要です。有効化の手続きは、登録フォームの提出によって行なうことができます。
クエリキューが有効な場合の挙動
以下の各セクションにて、クエリキューが有効な場合の挙動について説明します。
同時実行数の決定
同時実行数(同時実行可能なクエリ数)は、使用可能なスロット数に基づく計算によって動的に自動決定できます。計算はプロジェクトごとに実行されます。同時実行数を超えた分のクエリは、スロットに空きができるまでの間、キューに一時保管されます。
例えば、同時実行数が5個の場合、下図のようになります。
ここで、上の各ブロックは、プロジェクトから送信されてきたクエリを表しています。同時実行数が5個であるため、1番目~5番目のクエリは同時実行されます。それ以降のクエリは、順次キューに格納されていきます。
キューに格納されているクエリの取り出し順序
キューに格納されているクエリの取り出し順序は、同時実行の割合が最も少ないプロジェクトのクエリが優先されます。
例えば、下図の状況を考えてみましょう。
ここで、「Ai」はAプロジェクトからのi番目のクエリ、「Bi」はBプロジェクトからのi番目のクエリを表しています。同時実行数は5、同時実行数を超えた分のクエリはキューに格納されています。
A1クエリの実行が完了し、1つスロットに空きができました。
キューから新しく取り出しされるクエリは、キューへの格納が一番早かったA5ではありません。同時実行の割合が最も少ないBプロジェクトのクエリが優先して取り出しされます。
予約の変更または削除が発生した場合の挙動
以下のそれぞれの場合において、予約の変更や削除が発生した場合の挙動を説明します。
-
予約を削除した場合
予約にて実行中のクエリと、キューに格納されているクエリが全てキャンセルになります。 -
予約に割り当てているプロジェクトを別の予約に再割り当てした場合
古い予約にて実行中のクエリと、キューに格納されているクエリは、引き続き古い予約にて実行されます。新しくプロジェクトから送信されてきたクエリは、全て新しい予約にて実行します。
ここで、「Ai」はAプロジェクトからのi番目のクエリ、「Bi」はBプロジェクトからのi番目のクエリを表しています。変更前に実行中だったA1・B1・A2と、キューに格納されていたB2・A3・B3は引き続き古い予約にて実行されます。 -
予約に割り当てているプロジェクトを削除した場合
プロジェクトの削除前に予約にて実行中だったクエリと、キューに格納されていたクエリは、引き続き予約にて実行されます。新しくプロジェクトから送信されてきたクエリは、全てオンデマンドにて実行されます。
オプション設定
クエリキューのオプション設定について説明します。
最大同時実行ターゲット
「最大同時実行ターゲット」とは、同時実行数の上限を指定することができるオプション設定項目です。利用可能なスロット数に基づいて自動計算した同時実行数が、最大同時実行ターゲットを超えていた場合、同時実行数が制限されます。
例えば、利用可能なスロット数に基づいて自動計算した同時実行数が10、最大同時実行ターゲットが5の場合、同時実行数は5になります。
デフォルトでは0に設定されており、同時実行数の上限はありません。
最大同時実行ターゲットの設定値は、いつでも変更可能です。ただし、変更前に実行していたクエリは、変更の影響を受けません。
例えば、設定値を以前よりも小さい値に変更した場合、変更前に実行していたクエリは影響を受けず、キューに格納されているクエリは同時実行数が新しい設定値を下回るまで取り出しされません。
具体的な最大同時実行ターゲットの設定・更新方法は、最大同時実行ターゲットの設定・更新方法を参照してください。
モニタリング
モニタリングできる項目について、以下の各セクションにて説明します。
クエリの状態
以下のビューを使うと、各クエリの状態(実行中orキュー格納中)をモニタリングできます。
上記ビューにて、「RUNNIG」となっているクエリは実行中、「PENDING」となっているクエリはキュー格納中であることが分かります。
キューに格納されているクエリの個数
以下のツールを使うと、キューに格納されているクエリの個数をモニタリングできます。
-
BigQuery管理リソースチャート
ジョブの同時実行チャートにて確認できます。 - Cloud Monitoring
ジョブ数の指標を表示し、保留状態のジョブ数(キューに格納されているクエリ数)を確認できます。
制限事項
各種制限事項について、以下の各セクションにて説明します。
キューに格納できるクエリ数の上限
以下のように、キューに格納できるクエリ数には上限があります。
- インタラクティブクエリの場合:1000個
- バッチクエリの場合:20000個
※上記の上限は、プロジェクトごと・リージョンごとの上限です。上限を引き上げることはできません。
例えば、インタラクティブクエリ・同時実行数5個の場合、下図のようになります。
上限を超えてクエリをキューに格納しようとすると、エラーが発生するため注意が必要です。
バッチクエリの同時実行上限
同時実行できるバッチクエリの上限は、同時実行数の30%です。
バッチクエリの同時実行数が上限の30%に達すると、インタラクティブクエリのみがキューから取り出しされるようになります。
ここで、「Bi」はi番目のバッチクエリ、「Ii」はi番目のインタラクティブクエリを表しています。同時実行しているバッチクエリが上限の30%を超えているため、キューから新しく取り出しされるクエリは、インタラクティブクエリのI8です。
キューのタイムアウト
デフォルトでは以下の制限時間を超えた場合、キューに格納されているクエリはタイムアウトされます。
- インタラクティブクエリの場合:6時間
- バッチクエリの場合:24時間
デフォルトの制限時間を変更したい場合、プロジェクトまたは組織のデフォルト構成にて、以下の設定を変更する必要があります。
- default_interactive_query_queue_timeout_ms
インタラクティブクエリのキューに格納できる制限時間(ミリ秒単位)の設定項目です。最小値は1ミリ秒、最大値は 48 時間です。-1を設定すると、インタラクティブクエリのキューイングを無効にすることができます。 - default_batch_query_queue_timeout_ms
バッチクエリのキューに格納できる制限時間(ミリ秒単位)の設定項目です。最小値は1ミリ秒、最大値は 48 時間です。-1を設定すると、バッチクエリのキューイングを無効にすることができます。
設定の変更には以下のステートメントを使用します。詳細はリンクを参照してください。
-
プロジェクトの場合:ALTER PROJECT SET OPTIONS
クエリキューの無効化方法
クエリキューは、BigQueryクエリキューフォームの提出によって、無効にできます。
予約に割り当てられているプロジェクトを、個別に有効化or無効化することはできません。
まとめ
本ページでは、クエリキューを使い始める時に知りたい情報(挙動や制限事項など)を中心にまとめました。
クエリキューを有効にするメリットは、クエリの同時実行数を利用可能なスロット数に基づいて動的に自動決定できるようになることです。同時実行数が固定値に設定されていたときよりも、スロットを無駄なく活用できるようになるため、処理効率のアップが期待できます。
ぜひご活用を検討ください!
Discussion