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 Audit Logs でも確認できます。たとえば、ログビューアを使用すると、メッセージ文字列に Quota exceeded または limit のいずれかが含まれるエラーを次のクエリで検索できます。

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

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

Cloud Audit Logs のその他のクエリ サンプルについては、BigQuery クエリをご覧ください。

同時クエリの割り当てエラー

Exceeded rate limits: too many concurrent queries for this project_and_region」というエラー メッセージが表示される場合、この割り当てでは、同時に実行できるインタラクティブ クエリジョブの数が制限されています。この上限を超えると、新しいクエリジョブがすぐに失敗します。

デフォルトでは、クエリはインタラクティブ モードで実行されます。このエラーを防ぐには、クエリをバッチモードに切り替えます。クエリはキューに追加され、リソースが使用可能になると実行されます。バッチクエリは同時実行のレート制限に対してカウントされないので、簡単に多くのクエリを一度に開始できます。

INFORMATION_SCHEMA.JOBS_BY_PROJECT を使用すると、プロジェクトで現在実行中のジョブを確認し、最大のコンシューマーを特定できます。他のユーザーに影響を与えないようにするには、これらのコンシューマーに対して、同時クエリを減らすか、バッチクエリを使用するか、別のプロジェクトを作成するように要求します。

このエラーは、ビジネス インテリジェンス(BI)ツールを使用して BigQuery のデータをクエリするダッシュボードを作成したときに発生することがあります。この場合、こうしたユースケース用に最適化されている BigQuery BI Engine の使用をおすすめします。

プロジェクトの同時実行クエリの上限を引き上げることもできます。ただし、この割り当てを増やすと、同じ数のスロットを使用するクエリが増えるため、ユーザークエリの競合が増える可能性があります。これはクエリのパフォーマンスに影響を与えます。したがって、同時クエリの上限を引き上げた場合は、スロット数を増やすことをおすすめします。上限を引き上げる方法については、割り当てと上限のページをご覧ください。

パーティション分割テーブルの割り当てエラー

パーティション分割テーブルの使用時に、BigQuery のパーティション分割テーブルの割り当てと上限に達することがあります。

エラー メッセージ「Quota exceeded: Your table exceeded quota for Number of partition modifications to a column partitioned table」が表示された場合、この割り当てを増やすことはできません。この割り当てエラーを解決するには、次のことをおすすめします。

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

このセクションでは、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% を常に超えている場合は、割り当ての引き上げをリクエストしてください。詳細については、割り当て上限の引き上げをリクエストするをご覧ください。

CSV ファイル読み込みの割り当てエラー

--allow_quoted_newlines フラグを使用して大きな CSV ファイルを読み込むと、インポートが失敗することがあります。次のエラー メッセージが表示されます。

Input CSV files are not splittable and at least one of the files is larger than
the maximum allowed size. Size is: ...

この問題を解決するには、--allow_quoted_newlines フラグを無効にするか、CSV ファイルをそれぞれ 4 GB 未満の小さなチャンクに分割します。上限の詳細については、読み込みジョブをご覧ください。