こんにちは。SCSKの山口です。
今回はBigQuery利用の料金を抑える一つの方法として、「オンデマンドクエリの上限値設定」をやってみます。
プロジェクト/クエリごとの上限値を設定し利用料金の増加を抑えるほか、意図しない大規模クエリによる利用料金の急増を抑える効果もあります。ぜひご覧ください。
BigQueryの料金体系
ここについては詳細に説明されている公式ドキュメント等があるため、要点を抑えて簡単に説明します。
BigQueryの料金は下記二つの要素で構成されています。
- コンピューティング料金:クエリを実行するためのコンピューティング料金
- ストレージ料金:BigQueryに読み込むデータを保存する料金
今回紹介する方法は「コンピューティング料金」を抑える方法です。
コンピューティング料金は、下記二つの課金体系から選択することができます。
- オンデマンド料金(TiB 単位):クエリごとに処理されるバイト数に応じて課金
- 容量料金(スロット時間単位):BigQueryエディションから料金モデルを選択
今回アプローチするのは「オンデマンド料金」です。
BigQueryエディションに関しての詳細はリンクの公式ドキュメントをご覧ください。
割り当てを設定する
割り当てとは、「使用できるカウント可能な共有リソースの量」を指します。いわゆる「上限値」です。
割り当てが不足すると、実行しようとしているタスクが割り当てエラーによって失敗します。
ユーザ・プロジェクト・組織単位での設定が可能です。
設定方法
- 下記のどちらかで「割り当てとシステム上限」のページへアクセスします。
- IAMと管理 – 割り当てシステムと上限 – フィルタで「BigQuery API」で検索
- APIとサービス – 有効なAPIとサービス – フィルタで「BigQuery API」で検索
以下、IAM画面からアクセスする方法で説明します。
- 「BigQuery API」の「Query usage per day」を選択した状態で右端の点三つ「その他の操作」をクリック
- 「割り当てを編集」をクリック
- 「新しい値」に設定したい上限値(単位はTiBのみ)を入力しリクエストを送信
ここまでで設定は完了です。
一日のクエリ量上限を超える見積のクエリを実行しようとすると、下記エラーが出ます。
Custom quota exceeded: Your usage exceeded the custom quota for QueryUsagePerDay, which is set by your administrator. For more information, see
今回は「Query usage per day」を選択し、プロジェクト全体で使用できる一日の上限値を設定しましたが、似た名称の「Query usage per day per user」を使用すると各ユーザが使用できる一日の上限値を設定することができます。
課金されるバイト数を制限する
今度はクエリ単位で課金される最大バイト数の上限値を設定する方法です。
クエリ費用の抑制方法として、BigQueryのドライラン機能を活用してクエリ量を見積もる方法も有効な手段です。詳細はリンク先のブログをご覧ください。
課金される最大バイト数を設定したことによってクエリが失敗した場合は、下記エラーが返されます。
Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.
設定方法
- BigQueryで「展開」タブから「クエリ設定」をクリック
- 「詳細オプション」を展開し、「課金される最大バイト数」に上限として設定したいバイト数を入力
上限を超えるクエリ(401 B)を実行すると、エラーが返されました。
まとめ
今回はBigQueryで各種上限値を設定してみました。
割り当ての設定では、管理者目線で一日あたりのクエリバイト数を制限することができます。
それに対して、クエリ単位でのバイト数制限では、利用者それぞれが意図しない利用量増加を防ぐために設定をすることができます。
私自身、BigQueryを触り始めて2年ほどになりますが、クエリを実行する前にどのくらいの処理バイトが発生するかを必ず確認するようにしています。
今回紹介した割り当ての設定で組織・プロジェクト単位での上限値設定は可能ですが、だれか一人が容量を食いつぶしてしまってやむを得ず上限解放する。といった事態になりかねないです。このような事態が多発すると上限値設定の意味も薄れてしまいます。
様々な上限値設定は用意されていますが、ひとり一人が意識する・対応策を打つことが重要ですね。
そのうえで、組織・プロジェクト単位での上限値を敷いておくのもかなり有効な手だと思います。
みなさんも今回紹介した内容をぜひご活用ください。