Fehler in BigQuery-Kontingenten beheben

BigQuery hat verschiedene Kontingente, die den Preis und das Volumen eingehender Anfragen begrenzen. Diese Kontingente sind sowohl zum Schutz der Back-End-Systeme als auch zum Schutz vor einer unerwarteten Abrechnung erforderlich, wenn Sie sehr große Jobs senden. In diesem Dokument wird beschrieben, wie Sie konkrete Fehler in Kontingenten diagnostizieren und beheben. Falls Ihre genaue Fehlermeldung in diesem Dokument nicht aufgeführt ist, lesen Sie die Informationen unter Fehlermeldungen. Hier finden Sie allgemeine Informationen zu Fehlern.

Übersicht

Wenn ein BigQuery-Vorgang aufgrund eines Kontingentlimits fehlschlägt, gibt die API den HTTP-Statuscode 403 Forbidden zurück. Der Antworttext enthält weitere Informationen zu dem erreichten Limit. Der Antworttext sieht etwa so aus:

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

Das Feld message in der Nutzlast beschreibt, welches Limit überschritten wurde. Das Feld message kann beispielsweise Exceeded rate limits: too many table update operations for this table enthalten.

Im Allgemeinen fallen Kontingentlimits in zwei Kategorien. Diese werden durch das Feld reason in der Antwortnutzlast angegeben.

  • rateLimitExceeded. Dieser Wert steht für ein kurzfristiges Limit. In der Regel können Sie diese Limitfehler beheben, indem Sie den Vorgang nach einigen Sekunden wiederholen. Verwenden Sie einen exponentiellen Backoff zwischen Wiederholungsversuchen. Erhöhen Sie also das Zeitintervall zwischen den einzelnen Wiederholungen exponentiell.

  • quotaExceeded. Dieser Wert gibt ein längerfristiges Limit an. Wenn Sie ein längerfristiges Kontingentlimit erreichen, sollten Sie mindestens 10 Minuten warten, bevor Sie den Vorgang wiederholen. Wenn Sie ständig eines dieser längerfristigen Kontingentlimits erreichen, sollten Sie Ihre Arbeitslast analysieren, um das Problem zu beheben. Sie können Arbeitslasten optimieren oder eine Erhöhung des Kontingents anfordern.

Bei Fehlern vom Typ quotaExceeded können Sie in der Fehlermeldung nachsehen, welches Kontingent überschritten wurde. Analysieren Sie dann Ihre Arbeitslast, um zu ermitteln, ob Sie ein Erreichen des Kontingents vermeiden können, indem Sie beispielsweise die Abfrageleistung optimieren. In einigen Fällen kann das Kontingent erhöht werden. Wenden Sie sich dazu an den BigQuery-Support oder an den Google Cloud-Vertrieb. Wir empfehlen jedoch, es zuerst mit den Vorschlägen in diesem Dokument zu versuchen.

Mit INFORMATION_SCHEMA-Ansichten können Sie das zugrunde liegende Problem analysieren. Diese Ansichten enthalten Metadaten zu Ihren BigQuery-Ressourcen, einschließlich Jobs, Reservierungen und Streaming-Insert-Anweisungen. Die folgende Abfrage verwendet beispielsweise die Ansicht JOBS_BY_PROJECT, um alle kontingentbezogenen Fehler des letzten Tages aufzulisten.

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')

Sie können Fehler auch in Cloud-Audit-Logs aufrufen. Mit der folgenden Abfrage in der Loganzeigewerden beispielsweise Fehler mit entweder Quota exceeded oder limit im Nachrichtenstring gefunden:

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

(Der Statuscode 7 lautet PERMISSION_DENIED und entspricht dem HTTP-Statuscode 403.)

Weitere Cloud-Audit-Logs-Abfragebeispiele finden Sie unter BigQuery-Abfragen.

Fehler bei Kontingenten gleichzeitiger Abfragen

Wenn Sie die Fehlermeldung Exceeded rate limits: too many concurrent queries for this project_and_region erhalten, begrenzt dieses Kontingent die Anzahl der gleichzeitigen interaktiven Abfragejobs, die gleichzeitig ausgeführt werden können. Wenn dieses Limit überschritten wird, schlagen neue Abfragejobs sofort fehl.

Abfragen werden standardmäßig im interaktiven Modus ausgeführt. Stellen Sie den Batchmodus um, um diesen Fehler zu vermeiden. Die Abfrage wird in die Warteschlange gestellt und ausgeführt, wenn Ressourcen verfügbar sind. Batch-Abfragen werden hinsichtlich der Grenze gleichzeitiger Abfragen nicht berücksichtigt. Dadurch ist es möglicherweise einfacher, viele Abfragen auf einmal zu starten.

Mit INFORMATION_SCHEMA.JOBS_BY_PROJECT können Sie die aktuellen Jobs prüfen, die im Projekt ausgeführt werden, um die größten Nutzer zu identifizieren. Um andere Nutzer nicht zu beeinträchtigen, können Sie diese großen Nutzer bitten, ihre gleichzeitigen Abfragen zu reduzieren, Batch-Abfragen zu verwenden oder ein separates Projekt zu erstellen.

Dieser Fehler kann auftreten, wenn Sie mit einem BI-Tool (Business Intelligence) Dashboards erstellen, die Daten in BigQuery abfragen. Wir empfehlen die Verwendung von BigQuery BI Engine, da es für diesen Anwendungsfall optimiert ist.

Es ist möglich, das Limit für gleichzeitige Abfragen für ein Projekt zu erhöhen. Eine Erhöhung dieses Kontingents kann jedoch zu mehr Konflikten bei Nutzerabfragen führen, da mehr Abfragen versuchen, dieselbe Anzahl von Slots zu verwenden. Dies wirkt sich auf die Leistung von Abfragen aus. Daher empfehlen wir, auch die Anzahl der Slots zu erhöhen, wenn das Limit für gleichzeitige Abfragen erhöht wird. Weitere Informationen zum Erhöhen dieses Limits finden Sie auf der Seite Kontingente und Limits.

Fehler bei Kontingenten partitionierter Tabellen

Bei der Verwendung partitionierter Tabellen gelten möglicherweise die Kontingente und Limits für partitionierte Tabellen von BigQuery.

Wenn Sie die Fehlermeldung Quota exceeded: Your table exceeded quota for Number of partition modifications to a column partitioned table erhalten, kann dieses Kontingent nicht erhöht werden. Zur Behebung dieses Kontingentfehlers empfehlen wir Folgendes:

Fehler beim Streaming-Insert-Kontingent

Dieser Abschnitt enthält einige Tipps zur Behebung von Kontingentfehlern im Zusammenhang mit dem Streamen von Daten in BigQuery.

In bestimmten Regionen haben Streaming-Insert-Anweisungen ein höheres Kontingent, wenn Sie das Feld insertId nicht für jede Zeile ausfüllen. Weitere Informationen zu Kontingenten für Streaming-Insert-Anweisungen finden Sie unter Streaming-Insert-Anweisungen. Die kontingentbezogenen Fehler beim BigQuery-Streaming hängen davon ab, ob insertId vorhanden ist oder fehlt.

Wenn das Feld insertId leer ist, kann der folgende Kontingentfehler auftreten:

Kontingentlimit Fehlermeldung
Bytes pro Sekunde und Projekt Die Entität mit gaia_id GAIA_ID, Projekt PROJECT_ID in Region REGION hat das Kontingent für Insert-Bytes pro Sekunde überschritten.

Wenn das Feld insertId ausgefüllt ist, können folgende Kontingentfehler auftreten:

Kontingentlimit Fehlermeldung
Zeilen pro Sekunde und Projekt Das Projekt PROJECT_ID in REGION hat das Kontingent zum Streamen von Insert-Zeilen pro Sekunde überschritten.
Zeilen pro Sekunde und Tabelle Die Tabelle TABLE_ID hat das Kontingent für das Streaming von Insert-Zeilen pro Sekunde überschritten.
Bytes pro Sekunde und Tabelle Die Tabelle TABLE_ID hat das Kontingent für das Streaming von Insert-Bytes pro Sekunde überschritten.

Der Zweck des Felds insertId besteht darin, eingefügte Zeilen zu deduplizieren. Wenn mehrere Einfügungen mit der gleichen insertId innerhalb von wenigen Minuten eingehen, schreibt BigQuery eine einzelne Version des Datensatzes. Dies ist jedoch nicht garantiert. Für einen maximalen Streamingdurchsatz empfehlen wir, insertId nicht einzufügen und stattdessen manuelle Deduplizierung zu verwenden. Weitere Informationen finden Sie unter Datenkonsistenz gewährleisten.

Diagnose

Analysieren Sie mit den STREAMING_TIMELINE_BY_*-Ansichten den Streaming-Traffic. Diese Ansichten aggregieren Streaming-Statistiken über einminütige Intervalle, gruppiert nach Fehlercode. Kontingentfehler werden in den Ergebnissen angezeigt, wenn error_code gleich RATE_LIMIT_EXCEEDED oder QUOTA_EXCEEDED ist.

Sehen Sie sich abhängig vom spezifischen Kontingentlimit, das erreicht wurde, total_rows oder total_input_bytes an. Wenn der Fehler ein Kontingent auf Tabellenebene ist, filtern Sie nach table_id. Die folgende Abfrage zeigt beispielsweise die Gesamtzahl der pro Minute aufgenommenen Bytes und die Gesamtzahl der Kontingentfehler.

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

Lösung

Wenn Sie das Feld insertId zur Deduplizierung verwenden und sich Ihr Projekt in einer Region befindet, die das höhere Streamingkontingent unterstützt, empfehlen wir, das Feld insertId zu entfernen. Diese Lösung erfordert möglicherweise einige zusätzliche Schritte, um die Daten manuell zu deduplizieren. Weitere Informationen finden Sie unter Duplikate manuell entfernen.

Wenn Sie insertId nicht verwenden oder die ID nicht entfernt werden kann, überwachen Sie Ihren Streaming-Traffic über einen Zeitraum von 24 Stunden und analysieren Sie die Kontingentfehler:

  • Wenn Sie hauptsächlich RATE_LIMIT_EXCEEDED-Fehler anstelle von QUOTA_EXCEEDED-Fehlern sehen und Ihr gesamter Traffic unter 80 % des Kontingents liegt, sind die Fehler möglicherweise auf vorübergehende Spitzen zurückzuführen. Zur Behebung dieser Fehler können Sie den Vorgang unter Verwendung von exponentiellem Backoff zwischen Wiederholungen wiederholen.

  • Wenn Sie QUOTA_EXCEEDED-Fehler erhalten oder der Traffic insgesamt 80 % des Kontingents überschreitet, senden Sie eine Anfrage zur Kontingenterhöhung. Weitere Informationen finden Sie unter Höheres Kontingentlimit anfordern.

Kontingentfehler beim Laden von CSV-Dateien

Wenn Sie eine große CSV-Datei mit dem Flag --allow_quoted_newlines laden, ist der Import manchmal nicht erfolgreich. Die folgende Fehlermeldung wird angezeigt:

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

Deaktivieren Sie zur Behebung des Problems entweder das Flag --allow_quoted_newlines oder teilen Sie die CSV-Datei in kleinere Blöcke mit jeweils weniger als 4 GB auf. Weitere Informationen zu den Limits finden Sie unter Ladejobs.