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

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 ページからリクエストを送信します。BigQuery サンドボックスを使用しているときにこのエラーが発生した場合は、アップグレードできます。
rateLimitExceeded 403 プロジェクトで多数のリクエストを短時間に送信して、同時実行レートの制限または API リクエストの制限を超過した場合にこのエラーが返されます。 リクエストのレートを下げます。

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

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