データ分析

Flex Slots を利用して BigQuery の費用を最適化

※この投稿は米国時間 2020 年 5 月 27 日に、Google Cloud blog に投稿されたものの抄訳です。

編集者注: これは BigQuery の費用の管理に関するシリーズの一部です。BigQuery の料金モデルの選択Reservations の効果的な使い方に関するシリーズの他の投稿もご覧ください。

Google Cloud のエンタープライズ データ ウェアハウスである BigQuery には多様な料金オプションがあり、リソースを最大限に活用できます。Google が最近導入した Flex Slots では、請求方法を所定期間の定額料金に切り替えることにより、非常に効率よくコストを削減できます。Flex Slots では、オンデマンド料金だけを使用するのではなく、定額料金を利用するメリットが大きい場合には定額料金も活用できます。

これは、1 テラバイトを超える大きなテーブルをクエリするユーザーにとっては非常に役立ちます。Flex Slots を利用して定額料金に切り替えることで、このような大規模なクエリにかかる費用を節約できます。たとえば、データ サイエンス ジョブや ELT ジョブを大きなテーブルで実施する場合は、Flex Slots を使用するメリットが大きいと言われています。また、数時間あるいは 1 日以上にわたって分析ジョブを行う AI Notebook ユーザーのチームを持つ企業も、Flex Slots からメリットを得られます。

この投稿では、プログラムによって Flex Slots を BigQuery ジョブに統合してクエリの急増やオンデマンドのスケーリングに対応し、多くの管理オーバーヘッドを使用することなく、予算内でデータ サイエンスのニーズを満たす方法を紹介します。

定額契約では、スキャンされたバイト数に従ってクエリの料金を支払うのではなく、予約したコンピューティング リソースに対する料金をお支払いいただきます。Flex Slots コミットメントは 60 秒を過ぎればいつでもキャンセルできます。この投稿を執筆している時点では、組織が Flex Slots を利用して BigQuery の US マルチリージョンで 1 時間クエリを実施した場合の料金は、4 TiB のオンデマンド クエリを 1 つ実施した場合の料金と同じです。  

Flex Slots の設定

BigQuery Reservations では、予約を管理するための専用プロジェクトを維持することをおすすめします。予約を作成するには、プロジェクトの bigquery.resourceAdmin ロールと Reservations API スロットの割り当てが必要です。 

コンセプトの説明

  • Flex Slots コミットメントは、500 スロット単位で 1 時間あたり $20(1 分あたり約 $0.33)で購入できます。クエリを高速化したり、精度を高めたりする必要がある場合は、スロット コミットメントを増やすことができます。  
  • 予約 では、名前を付けたスロットの割り当てが作成されます。購入したスロットをプロジェクトに割り当てるには、予約が必要です。予約について詳しくは、こちらのドキュメントをご覧ください。
  • 割り当てでは、予約を組織、フォルダ、プロジェクトに割り当てます。割り当てが行われると、プロジェクトのすべてのクエリが、オンデマンドによる料金請求から購入済みスロットに対する料金請求に切り替わります。

1 bigquery Flex Slot.jpg

Flex Slots コミットメントは Google Cloud Console の Reservations UI から変更できます。この投稿では、Python クライアント ライブラリを使って Flex Slots の予約をプログラムによってジョブに適用する方法を紹介します。これにより、必要に応じてスロットのスケジュールを設定し、不要なアイドル時間を減らすことができます。その結果、管理者がボタンをクリックしなくても、いつでもジョブを実行でき、不要になったらスロット コミットメントを自動的に削除できます(この場合も管理者の操作は不要です)。  

クライアント セッションの認証方法については、BigQuery のクイックスタートのドキュメントをご覧ください。以下は、ELT ジョブの実行中に Flex Slots を購入するための簡単なスクリプトです。
  from google.cloud import bigquery
from google.cloud.bigquery.bigquery_reservation_v1 import *
import time

bq_client = bigquery.Client(project='[PROJECT]')
res_client = ReservationClient()
parent = 'projects/{}/locations/{}'.format('[ADMIN_PROJECT]', '[LOCATION]')

# commit to a flex slots purchase, billing begins
commit_config = CapacityCommitment(plan='FLEX', slot_count=500)
commit = res_client.create_capacity_commitment(parent=parent,
                                               capacity_commitment=commit_config)

# create a slot reservation with a descriptive name
res_config = Reservation(slot_capacity=500, ignore_idle_slots=False)
res = res_client.create_reservation(parent=parent,
                                    reservation_id='[RESERVATION_NAME]',
                                    reservation=res_config)

# assign the reservation to the project executing the BigQuery jobs
assign_config = Assignment(job_type='QUERY',
                           assignee='projects/{}'.format('[PROJECT]'))
assign = res_client.create_assignment(parent=res.name, assignment=assign_config)

# Assignments can take up to three minutes to take effect
time.sleep(180)

# execute large jobs at flat rate pricing
job = bq_client.query("merge into `dataset.analytics_table` using select ...")
job.result(max_results=1)

# remove the assignment, reservation, and capacity commitment
res_client.delete_assignment(name=assign.name)
res_client.delete_reservation(name=res.name)
res_client.delete_capacity_commitment(name=commit.name)

クエリの予約の確認

クエリの統計情報は、BigQuery コンソールの [クエリ履歴] タブに見やすい形式で表示されます。以下に示すように、予約名には予約したスロットを使用したクエリのプロパティが併記されます。
2 Confirming query reservations.jpg

ランタイムと費用の解釈

次のグラフは、ソフトキャップが 2,000 スロットのクエリをオンデマンドで実行した場合と、スロットを 500 単位で最大 2,000 まで増やして 3.15 TB のオンディマンド クエリを実行した場合とでクエリ時間と費用を比較したものです。Flex Slots ではアイドル時間に対する料金の支払いも発生し、大きな予約では料金が高額になることもあることに注意が必要です。Flex Slots の料金は、3 分間のアイドル時間分を追加しても、大きなクエリのオンデマンド料金よりも 60%~80% 少なくなっています。
4 avg query cost.jpg

スロットの追加に伴いほぼ一直線にパフォーマンスが上昇しています。

3 slots and on-demand.jpg

Flex Slots の利用により 60%~80% のコスト削減


Flex Slots と Reservation API を併用することで、これまでのデータ ウェアハウス ソリューションでは経験したことのない柔軟性がもたらされ、組織の費用とパフォーマンスのプロファイルをきめ細かく調整できるようになります。BigQuery の使い方、Reservations API での開発方法について詳しくは、以下のリソースをご覧ください。

● BigQuery Reservations の概要を確認する              

● BigQuery スロットの詳細を確認する              

● Python Client for Cloud BigQuery Reservation のドキュメントを確認する

● Flex Slots の料金の詳細を確認する

- By Cloud ソリューション アーキテクト Patrick Dunn