BigQuery の割り当てエラーのトラブルシューティング

BigQuery には、受信リクエストの速度と量を制限するさまざまな割り当てがあります。これらの割り当ては、バックエンド システムの保護と、非常に大規模なジョブの送信による予期しない課金を防ぐために役立ちます。このドキュメントでは、割り当てに起因するエラーを診断して軽減する方法について説明します。

概要

割り当て上限が原因で BigQuery オペレーションが失敗した場合、API は HTTP 403 Forbidden ステータス コードを返します。レスポンスの本文には、到達した上限に関する詳細が記載されています。レスポンスの本文は次のようになります。

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Quota exceeded: ...",
    "reason" : "quotaExceeded"
  } ],
  "message" : "Quota exceeded: ..."
}

ペイロードの message フィールドには、どの上限を超過したかが示されます。たとえば、message フィールドは Exceeded rate limits: too many table update operations for this table のようになります。

一般に、割り当て上限は、レスポンス ペイロードの reason フィールドで示される 2 つのカテゴリに分類されます。

  • rateLimitExceeded。この値は、短期的な上限を示します。通常、このような上限は数秒後にオペレーションを再試行することで解決できます。再試行の間に「指数バックオフ」を使用します。つまり、再試行のたびに指数関数的に遅延が増加します。

  • quotaExceeded。この値は、長期的な上限を表します。長期的な割り当て上限に達した場合は、10 分以上経過してからもう一度オペレーションをお試しください。このような長期的な割り当て上限に何度も繰り返し到達する場合は、ワークロードを分析して問題の軽減方法を検討する必要があります。ワークロードの最適化や割り当て上限の引き上げなどにより軽減できる場合があります。

quotaExceeded エラーについては、エラー メッセージを調べて、どの割り当て上限を超過しているかを把握します。次に、ワークロードを分析して、クエリのパフォーマンスの最適化などで、割り当ての上限に達しないようにできるかどうか確認します。BigQuery のサポートまたは Google Cloud セールスに割り当ての引き上げをリクエストすることもできます。

根本的な問題の分析に INFORMATION_SCHEMA ビューを使用します。これは、ジョブ、予約、ストリーミング挿入など、BigQuery リソースに関するメタデータを含む一連のビューです。たとえば、次のクエリでは JOBS_BY_PROJECT ビューを使用して、前日の割り当てに関するすべてのエラーを一覧表示します。

SELECT
 job_id,
 creation_time,
 error_result
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) AND
      error_result.reason IN ('rateLimitExceeded', 'quotaExceeded')

エラーは Cloud 監査ログでも確認できます。たとえば、ログビューアを使用すると、メッセージ文字列に Quota exceeded が含まれるエラーを次のクエリで検索できます。

resource.type = ("bigquery_project" OR "bigquery_dataset")
protoPayload.status.code ="7"
protoPayload.status.message: "Quota exceeded"

(ステータス コード 7PERMISSION_DENIED で、HTTP 403 ステータス コードに対応しています。)

ストリーミング挿入の割り当てエラー

このセクションでは、BigQuery へのデータのストリーミングに関連する割り当てエラーを解決するためのヒントをいくつか紹介します。

特定のリージョンでは、各行の insertId フィールドにデータを入力しないと、ストリーミング挿入の割り当て量が高くなります。ストリーミング挿入の割り当ての詳細については、ストリーミング挿入をご覧ください。BigQuery ストリーミングの割り当て関連エラーは、insertId の有無によって異なります。

insertId フィールドが空の場合、次の割り当てエラーが発生する可能性があります。

割り当て上限 エラー メッセージ
プロジェクトごと 1 秒あたりのバイト数 リージョン: REGION 内の gaia_id: GAIA_ID、プロジェクト: PROJECT_ID のエンティティが、1 秒あたりの挿入バイト数に対する割り当てを超過しました。

insertId フィールドに値が入力されている場合、次の割り当てエラーが発生する可能性があります。

割り当て上限 エラー メッセージ
プロジェクトごと 1 秒あたりの行数 REGION 内のプロジェクト PROJECT_ID で、1 秒あたりのストリーミング挿入行数に対する割り当てを超過しました。
テーブルごと 1 秒あたりの行数 テーブル: TABLE_ID で、1 秒あたりのストリーミング挿入行数に対する割り当てを超過しました。
テーブルごと 1 秒あたりのバイト数 テーブル: TABLE_ID で、1 秒あたりのストリーミング挿入バイト数に対する割り当てを超過しました。

insertId フィールドの目的は、挿入した行の重複を排除することです。数分で同じ insertId が複数挿入されると、BigQuery は 1 つのバージョンのレコードを書き込みます。ただし、この自動重複排除は保証されていません。ストリーミングのスループットを最大にするために、insertId を含めずに手動の重複排除を使用することをおすすめします。詳細については、ベスト エフォート型の重複排除をご覧ください。

診断

ストリーミング トラフィックの分析には STREAMING_TIMELINE_BY_* ビューを使用します。これは、ストリーミング統計を 1 分間隔で集計し、エラーコードでグループ化したビューです。割り当てエラーは、結果で error_codeRATE_LIMIT_EXCEEDED または QUOTA_EXCEEDED に等しくなっています。

到達した割り当て上限に従い、total_rows または total_input_bytes を確認します。テーブルレベルの割り当てに関するエラーの場合は、table_id でフィルタリングします。たとえば次のクエリは、1 分で取り込まれる合計バイト数と割り当てエラーの総数を示します。

SELECT
 start_timestamp,
 error_code,
 SUM(total_input_bytes) as sum_input_bytes,
 SUM(IF(error_code IN ('QUOTA_EXCEEDED', 'RATE_LIMIT_EXCEEDED'),
     total_requests, 0)) AS quota_error
FROM
 `region-us`.INFORMATION_SCHEMA.STREAMING_TIMELINE_BY_PROJECT
WHERE
  start_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY)
GROUP BY
 start_timestamp,
 error_code
ORDER BY 1 DESC

解決策

ストリーミング割り当ての引き替えをサポートしているリージョンにあるプロジェクトで重複排除に insertId フィールドを使用している場合は、その insertId フィールドを削除することをおすすめします。この解決策では、データの重複が発生すると手動で排除しなければならないため、追加の手順が必要になる場合があります。詳細については、手動の重複排除をご覧ください。

insertId を使用していない場合、または削除できない場合は、24 時間のストリーミング トラフィックをモニタリングし、割り当てエラーを分析します。

  • 発生しているエラーが QUOTA_EXCEEDED ではなく主に RATE_LIMIT_EXCEEDED である場合、トラフィック全体が割り当ての 80% を下回ると、エラーで一時的な急増が示されることがあります。このようなエラーを処理するには、オペレーションを再試行する前に指数バックオフを使用します。

  • QUOTA_EXCEEDED エラーが発生した場合や、トラフィック全体が割り当ての 80% を常に超えている場合は、割り当ての引き上げをリクエストしてください。