Risoluzione degli errori di quota di BigQuery

BigQuery prevede varie quote che limitano la frequenza e il volume di richieste in entrata. Queste quote hanno lo scopo di proteggere i sistemi di backend e di prevenire attività di fatturazione impreviste quando invii job di dimensioni molto grandi. Questo documento descrive come diagnosticare e mitigare gli errori derivanti dalle quote.

Panoramica

Se un'operazione di BigQuery non va a buon fine a causa di un limite di quota, l'API restituisce il codice di stato HTTP 403 Forbidden. Il corpo della risposta contiene ulteriori informazioni sul limite raggiunto. Il corpo della risposta avrà il seguente aspetto:

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

Il campo message nel payload descrive quale limite è stato superato. Ad esempio, il contenuto del campo message potrebbe essere Exceeded rate limits: too many table update operations for this table.

In generale, i limiti di quota si suddividono in due categorie, indicate dal campo reason nel payload della risposta.

  • rateLimitExceeded. Questo valore indica un limite a breve termine. Di solito puoi risolvere i problemi relativi a questi limiti ripetendo l'operazione dopo pochi secondi. Usa il backoff esponenziale tra tentativi successivi. In altre parole, aumenta in modo esponenziale il ritardo tra un nuovo tentativo e l'altro.

  • quotaExceeded. Questo valore indica un limite a lungo termine. Se raggiungi un limite di quota a lungo termine, devi attendere almeno 10 minuti prima di riprovare a eseguire l'operazione. Se raggiungi sistematicamente uno di questi limiti di quota a lungo termine, devi analizzare il tuo carico di lavoro per capire come risolvere il problema. Le mitigazioni possono includere l'ottimizzazione del carico di lavoro o la richiesta di aumento della quota.

Per gli errori quotaExceeded, esamina il messaggio di errore per capire quale limite di quota è stato superato. Analizza quindi il carico di lavoro per capire se puoi evitare di raggiungere la quota, ad esempio ottimizzando le prestazioni delle query. In alcuni casi, la quota può essere aumentata contattando l'assistenza di BigQuery o contattando il team di vendita di Google Cloud.

Puoi usare le viste INFORMATION_SCHEMA per analizzare il problema di fondo. Di seguito è riportato un insieme di viste che contengono metadati relativi alle tue risorse BigQuery, tra cui job, prenotazioni e inserimenti di flussi di dati. Ad esempio, la seguente query usa la vista JOBS_BY_PROJECT per elencare tutti gli errori relativi alle quote del giorno precedente.

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

Puoi anche visualizzare gli errori negli audit log di Cloud. Ad esempio, usando il visualizzatore log, la seguente query rileva errori con Quota exceeded nella stringa del messaggio:

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

Il codice di stato 7 è PERMISSION_DENIED, che corrisponde al codice di stato HTTP 403.

Errori di quota relativi agli inserimenti di flussi di dati

Questa sezione fornisce alcuni suggerimenti per la risoluzione dei problemi relativi alle quote per i flussi di dati in BigQuery.

In alcune aree geografiche, gli inserimenti di flussi di dati hanno una quota maggiore se non immetti dati nel campo insertId per ogni riga. Per ulteriori informazioni sulle quote per gli inserimenti di flussi di dati, consulta la pagina relativa agli Inserimento di flussi di dati. Gli errori relativi alle quote per i flussi di dati di BigQuery dipendono dalla presenza o dall'assenza di un valore nel campo insertId.

Se il campo insertId è vuoto, si può verificare il seguente errore di quota:

Limite quota Messaggio di errore
Byte al secondo per progetto La tua entità con ID GAIA GAIA_ID, progetto PROJECT_ID e area geografica REGION ha superato la quota di inserimento byte al secondo.

Se il campo insertId è compilato, si possono verificare i seguenti errori di quota:

Limite quota Messaggio di errore
Righe al secondo per progetto Il tuo progetto PROJECT_ID in REGION ha superato la quota per l'inserimento di righe di flussi di dati al secondo.
Righe al secondo per tabella La tua tabella TABLE_ID ha superato la quota per l'inserimento di righe di flussi di dati al secondo.
Byte al secondo per tabella La tua tabella TABLE_ID ha superato la quota per l'inserimento di byte di flussi di dati al secondo.

Lo scopo del campo insertId è deduplicare le righe inserite. Se arrivano più inserimenti con lo stesso insertId nel giro di pochi minuti, BigQuery scrive un'unica versione del record. Tuttavia, questa deduplicazione automatica non è garantita. Per la massima velocità effettiva di trasmissione dei flussi di dati, ti consigliamo di non includere insertId e di usare invece la deduplicazione manuale. Per ulteriori informazioni, consulta la pagina relativa a come garantire la coerenza dei dati.

Diagnosi

Usa le viste STREAMING_TIMELINE_BY_* per analizzare il traffico dei flussi di dati. Queste viste aggregano le statistiche relative ai flussi di dati in intervalli di un minuto, raggruppate per codice di errore. Gli errori di quota vengono visualizzati nei risultati con error_code uguale a RATE_LIMIT_EXCEEDED o QUOTA_EXCEEDED.

A seconda del limite di quota specifico raggiunto, fai riferimento a total_rows o total_input_bytes. Se l'errore riguarda una quota a livello di tabella, filtra per table_id. Ad esempio, la seguente query mostra i byte totali importati al minuto e il numero totale di errori di quota.

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

Soluzione

Se usi il campo insertId per la deduplicazione e il tuo progetto si trova in un'area geografica che supporta una quota per i flussi di dati maggiore, ti consigliamo di rimuovere il campo insertId. Questa soluzione potrebbe richiedere passaggi aggiuntivi per la deduplicazione manuale dei dati. Per ulteriori informazioni, vedi Rimozione manuale dei duplicati.

Se non usi insertId, oppure non è possibile rimuoverlo, monitora il traffico dei flussi di dati per un periodo di 24 ore e analizza gli errori di quota:

  • Se risultano soprattutto errori RATE_LIMIT_EXCEEDED anziché errori QUOTA_EXCEEDED e il traffico complessivo è inferiore all'80% della quota, gli errori indicano probabilmente picchi temporanei. Per gestire questi errori, puoi eseguire nuovamente l'operazione usando il backoff esponenziale tra tentativi successivi.

  • Se risultano errori QUOTA_EXCEEDED o il traffico complessivo supera costantemente l'80% della quota, invia una richiesta di aumento della quota.