Google BigQueryは従量課金で比較的安価なため、今まで料金のことはあまり気にせず使っていました。
ビッグデータ分析は、今まで推測するしかなかった事柄が、実際に数値として出せるようになり画期的でした。
その便利さが周知されるようになると、BigQueryが使われる場面が増えてきました。そして、取れるデータは全て取っておこうとデータ量も増えてきました。
すると、BigQuery使用料は徐々に上がっていき、割と存在感のある金額になってきて、今まで無縁かと思っていた定額料金も気になりはじめたので、BigQueryの定額料金を見積もってみることにしました。
料金(概要)
BigQueryは主に分析とストレージに対して料金がかかります。
ストレージ料金は保持しているデータベース容量に比例した料金がかかります。分析料金はクエリ実行にかかる料金で、従量課金と定額課金があり、今回はこの分析料金の見積もりを行いました。
分析料金は従量課金の場合、クエリ実行時にデータベースから読み出したデータ量に比例した料金がかかり、2022年8月現在は、1TBあたり$5です。
見積もり方法(従量課金)
実行したクエリのログはINFORMATION_SCHEMA
のジョブビューで見れます。
クエリで読み出したデータ量はtotal_bytes_billed
に記録されるので、これに単価をかけることにより、クエリ毎にどれだけ分析料金がかかっているかを調べることができます。
詳しくは下記を参照ください。
分析料金(定額課金)
分析料金の定額課金は、月に確保するスロット数に対して支払います。
最低100スロットから、100スロット単位で購入でき、100スロットあたり月額$2,000です。($200じゃないです。$2,000です)
スロットとは?
BigQueryは分析処理を並行実行することにより、大量のデータの処理を短時間で行います。
その同時並行処理数をスロットと呼びます。定額課金では、そのスロット数を購入します。
スロットはCPUのようなもので、分析に使うCPUを予め購入しておくイメージに近いでしょうか。
見積もり方法(定額課金)
では、何スロットを購入すればいいのでしょうか?
従量課金の場合スロット数は固定ではなく、クエリ毎に最適なスロット数をBigQueryが算出して自動で割り当てて、クエリが実行されています。
定額課金のスロット数を見積もるにあたり、従量課金のクエリ実行で、実際に何スロット使ったかを調べてみます。
データ算出は従量課金の時同様、INFORMATION_SCHEMA
のジョブビューを用います。
クエリの実際の実行時間はjob_ms
になります。また、そのクエリを1スロットだけで実行した場合にかかる時間がtotal_slot_ms
になります。
なので、ざっくりとした値になりますが、total_slot_ms
をjob_ms
で割ると、そのクエリのスロット数が求まります。
実際のスロット数
手元のデータで、クエリ毎にスロット数と読込データ量でプロットしたのが下記図になります。
横軸が読込データ量、縦軸がスロット数です。
従量課金の場合、最大2,000スロットまで使って実行(バーストで超えることはある)するとなっています。
オンデマンド料金では、プロジェクトで最大 2,000 個の同時実行スロットを設定できます。BigQuery スロットは、単一のプロジェクト内のすべてのクエリで共有されます。BigQuery が、クエリを高速化するためにこの上限を超えてバーストする場合があります。
グラフを見ると、実際に使える時は2,000スロットをフルに使って、クエリが実行されているのが分かります。
見積もりの問題点
グラフを見ると分かるように、読込データ量とスロット数が比例していません。
従量課金の分析料金が高くなったからといって、そのまま同程度の額のスロットを購入すればいいという話ではありません。
スモールスタートということで、最低の100スロットだけ購入して始めてしまうと、今まで2,000スロットで実行していたクエリが100スロットで実行することとなり、最悪な場合クエリ実行時間が20倍になってしまいます。
つまり、従量課金と定額課金では、課金軸が異なるので、単純な比較・見積もりができないのです。
感想
データ分析は試行錯誤しながら行うもので、クエリ実行時間が10倍、20倍になるのは辛いです。
最低100スロットから買えるというものの、今までの実行時間を担保しながらというのであれば、2,000スロットは必要ということになり、想定していたものより高かったです。
従量課金は、かなり大規模なデータベースや、ストリームで24時間クエリを実行したり、BigQuery MLでゴリゴリに機械学習する際に、選択肢に上がってくる類のものかも知れませんね。