デベロッパー

INFORMATION_SCHEMA による BigQuery の予約とスロット使用率のモニタリング

#bq

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

BigQuery Reservations は、BigQuery ワークロードの管理に役立ちます。クエリに対してオンデマンドで料金を支払うのではなく、定額制で BigQuery スロットのコミットメントを購入できます。購入単位は 100 スロットで、フレックス、月間、年間のプランが用意されています。次に、予約と呼ばれるスロットのバケットを作成または管理し、それらの予約でスロットを使用するプロジェクト、フォルダ、組織を割り当てることができます。デフォルトでは、予約で実行されるクエリは、他の予約のアイドル スロットを自動的に使用します。このようにして、優先度の高いジョブが常に競合なしで必要なリソースにアクセスでき、ワークロード管理が効率化します。現在、予約とスロットのモニタリングには 2 通りの方法があります。BigQuery Reservations UI を使用する方法と、Cloud Monitoring を使用する方法です。

しかし、1 つの予約に委任すべきスロットの数は、どのように判断すればよいのでしょうか?あるいは、予約の使用率の過不足や、すべての予約にわたるスロット全体の使用率を知るには、どうすればよいのでしょうか?このブログ投稿では、BigQuery の INFORMATION_SCHEMA システム テーブルを使用して System Tables Reports Dashboard を作成する方法をご紹介し、これらの疑問に答えます。

INFORMATION_SCHEMA テーブルの使用

INFORMATION_SCHEMA メタデータ テーブルには、ジョブ、予約、容量コミットメント、割り当てについてのきめ細かい関連情報が含まれています。これらのテーブルのデータを使用して、関心のある指標をレポートするカスタム ダッシュボードを作成し、意思決定に役立てられます。

INFORMATION_SCHEMA が複数のテーブルから構成されている場合、ジョブおよび予約全体のスロット使用率モニタリングに特に関連しているテーブルがいくつかあります。JOBS_BY_ORGANIZATION テーブルは、組織内のすべてのプロジェクトにわたってジョブレベル データの抽出を行うプライマリ テーブルです。この情報に、CAPACITY_COMMITMENT_CHANGES_BY_PROJECT、RESERVATION_CHANGES_BY_PROJECTASSIGNMENT_CHANGES_BY_PROJECT の各テーブルからのデータを追加して、特定の容量コミットメント、予約、割り当てに関する詳細を含めることができます。INFORMATION_SCHEMA のデータ保持期間は 180 日でありタイムスタンプはすべて UTC であることにご注意ください。これらのテーブルに対してクエリを実行するために必要な権限については、上述のリンク先をご覧ください。

System Tables Reports Dashboard によるモニタリング

System Tables Reports Dashboard は、データポータルの BigQuery コネクタを使用して INFORMATION_SCHEMA からデータをクエリするデータポータルのダッシュボードです。このダッシュボードやその基礎クエリをそのまま、または出発点として利用することで、データポータルなどのダッシュボード ツールで、さらに複雑なソリューションを実現できます。

Daily Utilization Report

Daily Utilization Report には、スロット日ベースで計測した組織の 1 日のスロット使用率の概要が示されます。レポート内の主要チャートは、1 日あたりのスロット全体の使用率と、組織のアクティブな容量コミットメントを表しています。このチャートは、組織の使用量とコミット(または購入)した総スロット数との比較を大まかに把握するのに最適です。

平均スロット使用率を導き出すには、以下のクエリを使用します。

  SELECT
  TIMESTAMP_TRUNC(jbo.creation_time, DAY) AS usage_date,
  jbo.reservation_id,
  jbo.project_id,
  jbo.job_type,
  jbo.user_email,
  -- Aggregate total_slots_ms used for all jobs on this day and divide
  -- by the number of milliseconds in a day. Most accurate for days with
  -- consistent slot usage
  SAFE_DIVIDE(SUM(jbo.total_slot_ms), (1000 * 60 * 60 * 24)) AS average_daily_slot_usage
FROM
  `region-{region_name}`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION jbo
GROUP BY
  usage_date,
  jbo.project_id,
  jbo.job_type,
  jbo.user_email,
  jbo.reservation_id
ORDER BY
  usage_date ASC

スロット使用率は、所定の 1 日の全ジョブで消費されたスロットミリ秒の合計(INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION からの total_slot_ms)を、1 日のミリ秒数(1,000 × 60 × 60 × 24)で割ることで、導きます。この集計レベルのコンピューティングによって、所定の 1 日のスロット全体の使用率をほぼ正確に概算できます。この計算は、1 日のスロット使用率が一定している組織で最も正確です。組織のスロット使用率が一定ではない場合、この数値が想定よりも低くなる可能性があります。平均スロット使用率計算の詳細については、公開ドキュメントをご覧ください。

このレポートには、使用率をジョブタイプ、プロジェクト ID、予約 ID(以下参照)、ユーザーのメール、上位使用率ごとにさらに細かく分けたチャートも含まれます。

Hourly Utilization Report

Hourly Utilization Report は、1 日の使用率レポートと類似していますが、このレポートで提供されるのは、スロット時間ベースで測定した組織の時間あたりのスロット使用率です。このレポートは、ワークロードをよりきめ細かく把握してワークロード管理に役立てるために使用できます。

Reservation Utilization Report

Reservation Utilization Report には、現在の割り当ておよび直近 7 日間または 30 日間の予約使用率の概要が示されます。

現在の予約割り当てテーブルには、割り当てタイプ、ジョブタイプ、予約容量など、組織全体の現在の割り当てに関する詳細が表示されます。

予約使用率テーブルには、直近 7 日間または 30 日間の所定の予約の使用率に関する情報が示されます。これには、週間または月間の平均スロット使用率、平均予約容量、現在の予約容量、平均予約使用率が含まれます。週間または月間の平均スロット使用率は、1 日の使用率と同じ計算式で導きます。ただし、それぞれ週または月の値に調整します。

これらのテーブルは、割り振られている予約を十分に活用しているか把握するのに適しています。使用率の過不足が大きい予約は赤で表示され、使用率が 100% に近い予約は緑で表示されます。ただし、アイドル スロット容量はデフォルトでは予約全体で共有されるため、予約の使用率が低くても、必ずしもスロットが無駄になっていることを示すわけではありません。そうではなく、単に当該の予約のジョブが予約済みスロットすべてを必要とせず、それらのスロットを別の予約に割り振り可能である場合があります。

Job Execution Report

Job Execution Report には、スロット使用率のジョブ別内訳など、ジョブの統計情報が示されます。このレポートは、個々のジョブへのドリルダウンや特定のジョブグループのトレンド把握を目的としています。

このレポートでは、平均スロット使用率が、集計レベルではなくジョブ別レベルで表示されます。これを計算するには、次のクエリに示すように、そのジョブの total_slot_ms を、ミリ秒単位でのジョブの持続期間(creation_time を end_time から引くことで計算可能)で割ります。

  SELECT
  project_id,
  job_id,
  reservation_id,
  EXTRACT(DATE FROM creation_time) AS creation_date,
  creation_time,
  end_time,
  TIMESTAMP_DIFF(end_time, creation_time, SECOND) AS job_duration_seconds,
  job_type,
  user_email,
  state,
  error_result,
  total_bytes_processed,
  -- Average slot utilization per job is calculated by dividing
  -- total_slot_ms by the millisecond duration of the job
  SAFE_DIVIDE(total_slot_ms,(TIMESTAMP_DIFF(end_time, start_time, MILLISECOND))) AS avg_slots
FROM
  `region-{region_name}`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
ORDER BY
  creation_time DESC

Job Error Report

Job Error Report には、ジョブが遭遇するエラーのタイプをプロジェクトやエラー理由などのフィールド別に集計した概要データが示されます。INFORMATION_SCHEMA テーブルでは、ジョブレベルのエラーに関する詳細情報が提供されます。組織のユースケースに応じて、このレポートをさらに具体的なエラーレポート情報でカスタマイズできます。

次のステップ

INFORMATION_SCHEMA および System Tables Reports Dashboard の詳細については、Coursera のコース Modernizing Data Lakes and Data Warehouses with GCP の動画をご確認ください。各レポート、使用するクエリ、ご自身の組織へのダッシュボードのコピー方法に関する詳細については、GitHub リポジトリにアクセスしてください。 

-データ分析担当戦略的クラウド エンジニア Vrishali Shah

-テクニカル アカウント マネージャー Yarden Ne'eman