エラーのトラブルシューティング

BigQuery の使用時に表示されるエラーには HTTP エラーコードとジョブエラーの 2 種類があります。ジョブエラーは、jobs.get() を呼び出したときに status オブジェクト内に示されます。

エラーの表

次の表は、BigQuery API に対してリクエストを行ったときに返される可能性のあるエラーの一覧です。API レスポンスには HTTP エラーコードとエラー オブジェクトが含まれています。下の表の「エラーコード」列はエラー オブジェクト内の reason プロパティに対応しています。

bq コマンドライン ツールを使用してステータスを確認しても、デフォルトではエラー オブジェクトは返されません。オブジェクトとその reason プロパティ(下の表のエラーコードに対応しています)を表示するには、--format=prettyjson フラグを使用します。例: bq --format=prettyjson show -j <job id>

下の表にない HTTP レスポンス コードを受け取った場合、そのレスポンス コードは HTTP リクエストによる問題または予期された結果を示します。たとえば、502 エラーはネットワーク接続に問題があることを示します。HTTP レスポンス コードの全一覧については、HTTP レスポンス コードについての記事をご覧ください。

エラーコード HTTP コード 説明 トラブルシューティング
accessDenied 403 アクセス権限のないリソース(テーブルデータセット、ジョブなど)にアクセスしようとしたときに返されます。また、読み取り専用オブジェクトを変更しようとしたときにも返されます。 リソース オーナーに問い合わせてリソースへのアクセス権限を付与してもらいます
backendError 500 または 503 一時的なサーバー障害(ネットワーク接続の問題、サーバー過負荷など)が発生しているときに返されます。 通常、しばらくしてからもう一度試します。ただし、jobs.get() 呼び出しと jobs.insert() 呼び出しの場合は特別で、このエラーのトラブルシューティングがあります。

jobs.get() 呼び出し

  • jobs.get() のポーリング時に 503 エラーが返された場合は、しばらくしてからもう一度ポーリングします。
  • ジョブが完了しても backendError を含むエラー オブジェクトが示された場合、ジョブは失敗しています。データ整合性の問題の発生を心配することなく、ジョブを再試行できます。

jobs.insert() 呼び出し

jobs.insert() 呼び出しの実行時にこのエラーが返された場合、ジョブが成功したかどうかは不明です。この場合は、ジョブを再試行する必要があります。

billingNotEnabled 403 プロジェクトで課金が有効になっていないときに返されます。 Google Cloud Platform Console でプロジェクトの課金を有効にします。
blocked 403 実行しようとしたオペレーションを BigQuery が一時的に禁止しているときに返されます。これは通常、サービス停止を防ぐために行われます。このエラーが発生することはほとんどありません。 詳細をサポートにお問い合わせください。
duplicate 409 すでに存在するジョブ、データセット、テーブルを作成しようとしたときに返されます。また、ジョブの writeDisposition プロパティが WRITE_EMPTY に設定されていて、ジョブがアクセスする書き込み先のテーブルがすでに存在するときにも返されます。 作成しようとしているリソース名を変更するか、ジョブの writeDisposition 値を変更します。
internalError 500 BigQuery 内で内部エラーが発生したときに返されます。 サポートに問い合わせるか、BigQuery 公開バグトラッカーを使用してバグを報告してください。
invalid 400 無効なクエリ以外のあらゆる種類の無効な入力(必須フィールドの不足、無効なテーブル スキーマなど)があるときに返されます。無効なクエリの場合には invalidQuery エラーが返されます。
invalidQuery 400 無効なクエリを実行しようとしたときに返されます。 クエリに構文エラーがないか、もう一度確認してください。クエリ リファレンスに、有効なクエリの作成方法についての説明と例があります。
notFound 404 存在しないリソース(データセット、テーブル、またはジョブ)を参照したときに返されます。スナップショット デコレータを使用して、最近ストリーミングされて削除されたテーブルを参照する場合にも発生することがあります。 リソース名を修正するか、ストリーミング後少なくとも 6 時間待ってから、削除されたテーブルを照会してください。
notImplemented 501 このジョブエラーは、実装されていない機能にアクセスしようとしたときに返されます。 詳細をサポートにお問い合わせください。
quotaExceeded 403 プロジェクトが BigQuery の割り当てまたはカスタム割り当てを超過したか、課金の設定なしでクエリの無料枠を超過したときに返されます。 超過した割り当ての詳細をエラー オブジェクトの message プロパティで確認します。BigQuery の割り当てをリセットしたり増やしたりするには、サポートにお問い合わせください。カスタム割り当てを変更するには、Google Cloud Platform Console ページからリクエストを送信します。
rateLimitExceeded 403 プロジェクトで多数のリクエストを短時間に送信して、同時実行レートの制限または API リクエストの制限を超過した場合に返されます。 リクエストのレートを下げます。

プロジェクトがいずれの制限も超過していないと思われる場合は、サポートにお問い合わせください。

resourceInUse 400 テーブルを含むデータセットを削除しようとしたとき、または現在実行中のジョブを削除しようとしたときに返されます。 データセットを空にしてから削除するか、ジョブが完了するのを待ってから削除します。
resourcesExceeded 400 クエリで使用するリソースの数が多すぎるときに返されます。
  • クエリを分割します。
  • ORDER BY 句を削除します。
  • クエリで JOIN を使用している場合は、サイズが大きいほうのテーブルを句の左側に指定します。
  • クエリで FLATTEN を使用している場合は、そのユースケースで必ず使用する必要があるかどうかを判断します。詳しくはネストされたデータと繰り返しデータについての記事をご覧ください。
  • クエリで EXACT_COUNT_DISTINCT を使用している場合は、代わりに COUNT(DISTINCT) の使用を検討します。
  • クエリで大きな <n> 値を持つ COUNT(DISTINCT <value>, <n>) を使用している場合は、代わりに GROUP BY の使用を検討します。詳しくは COUNT(DISTINCT) についての記事をご覧ください。
  • クエリで UNIQUE を使用している場合は、代わりに GROUP BY を使用するか、サブセレクト内でウィンドウ関数を使用することを検討します。
responseTooLarge 403 クエリの結果が最大レスポンス サイズよりも大きいときに返されます。クエリによっては複数のステージで実行されますが、このエラーは、いずれかのステージで返されるレスポンス サイズが大きすぎるときに返されます。最終的な結果が最大レスポンス サイズより小さい場合でもエラーとなります。このエラーは、クエリで ORDER BY 句を使用しているときによく返されます。 LIMIT 句を追加するとエラーが解消されることがあります。または ORDER BY 句を削除します。サイズの大きい結果を返せるようにしたい場合は、allowLargeResults プロパティを true に設定し、書き込み先テーブルを指定します。
stopped 200 このステータス コードは、ジョブがキャンセルされた場合に返されます。
tableUnavailable 400 一部の BigQuery テーブルでは、他の Google プロダクト チームによって管理されているデータが使用されます。このエラーは、そのようなテーブルが利用できないことを示します。 このエラー メッセージに遭遇した場合は、リクエストを再試行する(internalError のトラブルシューティング ヒントを参照)か、データへのアクセス権を付与した Google プロダクト チームに問い合わせます。

エラー レスポンスの例

GET https://www.googleapis.com/bigquery/v2/projects/12345/datasets/foo
Response:
[404]
{
  "error": {
  "errors": [
  {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found: Dataset myproject:foo"
  }],
  "code": 404,
  "message": "Not Found: Dataset myproject:foo"
  }
}

認証エラー

OAuth トークン生成システムによってスローされたエラーは、次の JSON オブジェクトを返します。これは OAuth2 仕様で定義されています。

{"error" : "description_string"}

このエラーは HTTP 400 Bad Request エラーまたは HTTP 401 Unauthorized エラーを伴います。description_string は OAuth2 仕様で定義されたエラーコードのいずれかになります。次に例を示します。

{"error":"invalid_client"}

トップへ戻る

ストリーミング挿入に関するトラブルシューティング

以下のセクションでは、BigQuery にデータをストリーミングする際に発生したエラーの解決方法について説明します。

失敗 HTTP レスポンス コード

ネットワーク エラーなどの失敗 HTTP レスポンス コードが返された場合、ストリーミング挿入が成功したかどうかを確認する方法はありません。リクエストを単に再送信しようとすると、テーブル内に重複行が発生する可能性があります。テーブルを重複から保護するには、リクエストの送信時に insertId プロパティを設定します。insertId プロパティは BigQuery によって重複排除に使用されます。

権限エラー、無効なテーブル名エラー、または割り当て超過エラーが返された場合、行は挿入されず、リクエスト全体が失敗します。

成功 HTTP レスポンス コード

成功 HTTP レスポンス コードが返された場合でも、BigQuery による行の挿入が部分的にしか成功しなかった可能性があるため、レスポンスの insertErrors プロパティをチェックして、行の挿入が成功したかどうかを確認する必要があります。

insertErrors プロパティが空のリストになっている場合は、すべての行が正常に挿入されています。その他の場合は、いずれかの行にスキーマの不一致がある場合を除き、insertErrors プロパティで示された行が挿入されておらず、その他すべての行は正常に挿入されています。errors プロパティには、行の挿入が失敗した理由に関する詳細情報が含まれます。index プロパティは、エラーに該当するリクエストの 0 ベースの行インデックスを示します。

BigQuery がリクエスト内で個別行のスキーマ不一致に遭遇した場合は、いずれの行も挿入されず、スキーマ不一致がなかった行も含めて、各行の insertErrors エントリが返されます。スキーマ不一致がなかった行は、エラーの reason プロパティが stopped に設定され、そのまま再送信できます。失敗した行には、スキーマ不一致に関する詳細情報が含まれます。

ストリーミング インサートのメタデータ エラー

BigQuery のストリーミング API はインサート率が高くなるように設計されているため、ストリーミング システムを操作する際の基本となるテーブルのメタデータの変更は最終的に一貫しています。ほとんどの場合、メタデータの変更は数分以内に伝播されますが、この期間中は API レスポンスにテーブルの矛盾した状態が反映されることがあります。

次のようなシナリオがあります。

  • スキーマの変更 - ストリーミング システムでスキーマの変更がすぐに取得されない可能性があるため、最近ストリーミング インサートを受け取ったテーブルのスキーマを変更すると、スキーマの不一致エラーが発生することがあります。
  • テーブルの作成 / 削除 - 存在しないテーブルへのストリーミングによって、notFound レスポンスのバリエーションが返されます。レスポンスでのテーブルの作成は、後続のストリーミング インサートですぐには認識されない可能性があります。同様に、テーブルを削除したり再作成したりすることによって、ストリーミング インサートが古いテーブルに効果的に配信され、新しく作成されたテーブルには存在しない期間が生成される可能性があります。
  • テーブルの切り捨て - 同様に、(たとえば、WRITE_TRUNCATE の writeDisposition を使用するクエリジョブを介して)テーブルのデータを切り捨てることによって、整合性期間中の後続の挿入が破棄される可能性があります。

欠損 / 利用不可能なデータ

ストリーミング インサートは一時的にストリーミング バッファに存在します。ストリーミング バッファは、管理対象ストレージとは異なる可用性の特性を持ちます。BigQuery でのテーブルコピーのジョブや tabledata.list のような API メソッドなどの一部の操作では、ストリーミング バッファを操作しません。したがって、最新のストリーミング データが宛先テーブルまたは出力に存在しません。

トップへ戻る

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。