Utilizzare le code delle query
BigQuery determina automaticamente il numero di query che possono essere eseguite contemporaneamente, chiamato concorrenza dinamica. Le query aggiuntive vengono messe in coda finché non diventano disponibili risorse di elaborazione. Questo documento spiega come controllare il target di concorrenza massima e impostare il timeout della coda per le query interattive e batch.
Panoramica
BigQuery determina dinamicamente il numero di query che possono essere eseguite contemporaneamente in base alle risorse di computing disponibili. Il numero di query che possono essere eseguite contemporaneamente viene calcolato per progetto on demand o per prenotazione. Le query aggiuntive vengono inserite in una coda finché non è disponibile capacità sufficiente per iniziare l'esecuzione. La lunghezza della coda è limitata a 1000 query interattive e 20.000 query batch per progetto per regione, indipendentemente dal fatto che il progetto sia on demand o utilizzi una prenotazione. L'esempio seguente mostra il comportamento di un progetto on demand quando la concorrenza delle query calcolata è 202:

Per le prenotazioni, puoi impostare il target di concorrenza massima, un limite superiore al numero di query che possono essere eseguite contemporaneamente in una prenotazione, per assicurarti che a ogni query venga allocato un numero minimo di slot. Non puoi specificare un target di concorrenza massima per un progetto on demand; viene sempre calcolato dinamicamente.
Comportamento di accodamento
BigQuery applica una pianificazione equa per garantire che nessun singolo progetto possa consumare tutti gli slot in una prenotazione.
Le query dei progetti con la quota di concorrenza più piccola vengono rimosse dalla coda per prime. Durante l'esecuzione, gli slot vengono distribuiti equamente tra i progetti prima di essere distribuiti tra i job all'interno di un progetto.
Ad esempio, supponiamo di avere una prenotazione assegnata a due progetti: A e B. BigQuery calcola 5 per la concorrenza della prenotazione. Il progetto A ha quattro query in esecuzione contemporaneamente, il progetto B ha una query in esecuzione e altre query sono in coda. Una query del progetto B verrebbe rimossa dalla coda per prima, anche se è stata inviata dopo la query del progetto A. Dopo che una query inizia l'esecuzione, riceve una quota equa di slot nella prenotazione condivisa.
Oltre al numero totale di query simultanee, BigQuery determina dinamicamente il numero massimo di query batch simultanee da eseguire per progetto on demand o prenotazione. Se il numero di query batch in esecuzione simultanea raggiunge questo massimo, le query interattive vengono assegnate con priorità anche se sono state inviate in un secondo momento.
Quando elimini una prenotazione, tutte le query in coda vanno in timeout. Quando un progetto assegnato a una prenotazione viene riassegnato a un'altra prenotazione, tutte le richieste in coda o in esecuzione continuano a essere eseguite nella vecchia prenotazione, mentre tutte le nuove richieste vanno alla nuova prenotazione. Quando un progetto assegnato a una prenotazione viene rimosso dalla prenotazione, le query in esecuzione continuano nella prenotazione, mentre le richieste nuove e in coda vengono eseguite utilizzando il modello on demand. Facoltativamente, puoi annullare i singoli job di query in esecuzione o in coda.
Controllare il timeout della coda
Per controllare il timeout della coda per le query interattive o batch, utilizza l'
ALTER PROJECT SET OPTIONS istruzione
o l'
ALTER ORGANIZATION SET OPTIONS istruzione
per impostare i campi default_interactive_query_queue_timeout_ms o
default_batch_query_queue_timeout_ms nella configurazione predefinita del progetto o dell'
organizzazione.
Per visualizzare il timeout della coda per le query interattive o batch nel tuo progetto,
esegui una query sulla
INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS vista.
Per disattivare l'accodamento, imposta il timeout della coda su -1. Se raggiungi la concorrenza massima delle query, le query aggiuntive non vanno a buon fine e viene visualizzato un errore ADMISSION_DENIED.
Impostare il target di concorrenza massima
Puoi impostare manualmente il target di concorrenza massima quando crei una prenotazione. Per impostazione predefinita, il target di concorrenza massima è zero, il che significa che BigQuery determina dinamicamente la concorrenza in base alle risorse disponibili. In caso contrario, se imposti un target diverso da zero, il target di concorrenza massima specifica un limite superiore al numero di query eseguite contemporaneamente in una prenotazione, il che garantisce una quantità minima di capacità di slot disponibile per ogni query eseguita.
L'aumento del target di concorrenza massima non garantisce l'esecuzione contemporanea di più query. La concorrenza effettiva dipende dalle risorse di computing disponibili, che possono essere aumentate aggiungendo altri slot alla prenotazione.
Ruoli obbligatori
Per ottenere l'autorizzazione necessaria per impostare la concorrenza in una nuova prenotazione, chiedi all'amministratore di concederti il ruolo IAM Editor risorse BigQuery (roles/bigquery.resourceEditor) nel progetto di amministrazione che mantiene la proprietà degli impegni.
Per saperne di più sulla concessione dei ruoli, vedi Gestire l'accesso a progetti, cartelle e organizzazioni.
Questo ruolo predefinito contiene l'
bigquery.reservations.create
autorizzazione,
necessaria per
impostare la concorrenza in una nuova prenotazione.
Potresti anche ottenere questa autorizzazione con ruoli personalizzati o altri ruoli predefiniti.
Per saperne di più sui ruoli IAM in BigQuery, vedi Ruoli e autorizzazioni predefiniti.
Impostare il target di concorrenza massima per una prenotazione
Seleziona una delle seguenti opzioni:
Console
Nella Google Cloud console, vai alla pagina BigQuery.
Nel menu di navigazione, fai clic su Gestione della capacità.
Fai clic su Crea prenotazione.
Seleziona le impostazioni della prenotazione.
Per espandere la sezione Impostazioni avanzate, fai clic sulla freccia di espansione .
Per impostare la concorrenza target dei job, attiva il pulsante di attivazione/disattivazione Ignora la concorrenza automatica target dei job e inserisci la concorrenza target dei job.
Fai clic su Salva.
SQL
Per impostare il target di concorrenza massima per una nuova prenotazione, utilizza l'
CREATE RESERVATION istruzione DDL
e imposta il
target_job_concurrency campo.
Nella Google Cloud console, vai alla pagina BigQuery.
Nell'editor di query, inserisci la seguente istruzione:
CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME` OPTIONS ( target_job_concurrency = CONCURRENCY);
Sostituisci quanto segue:
-
ADMIN_PROJECT_ID: il progetto proprietario della prenotazione -
LOCATION: la località della prenotazione, ad esempioregion-us -
RESERVATION_NAME: il nome della prenotazione -
CONCURRENCY: il target di concorrenza massima
-
Fai clic su Esegui.
Per saperne di più su come eseguire le query, vedi Eseguire una query interattiva.
bq
Per impostare il target di concorrenza massima per una nuova prenotazione, esegui il
bq mk comando:
bq mk \
--project_id=ADMIN_PROJECT_ID \
--location=LOCATION \
--target_job_concurrency=CONCURRENCY \
--reservation \
RESERVATION_NAME
Sostituisci quanto segue:
ADMIN_PROJECT_ID: il progetto proprietario della prenotazioneLOCATION: la località della prenotazioneCONCURRENCY: il target di concorrenza massimaRESERVATION_NAME: il nome della prenotazione
API
Per impostare il target di concorrenza massima nell'
API BigQuery Reservation,
imposta il campo concurrency nella
risorsa di prenotazione
e chiama il
CreateReservationRequest metodo.
Aggiornare il target di concorrenza massima
Puoi aggiornare il target di concorrenza massima per una prenotazione in qualsiasi momento. Tuttavia, l'aumento del target non garantisce l'esecuzione contemporanea di più query. La concorrenza effettiva dipende dalle risorse di computing disponibili. Se riduci il target di concorrenza massima, le query in esecuzione attiva non vengono interessate e le query in coda non vengono eseguite finché il numero di query simultanee non scende al di sotto del nuovo target.
Se imposti il target di concorrenza massima su 0, BigQuery determina dinamicamente la concorrenza in base alle risorse disponibili (il comportamento predefinito).
Ruoli obbligatori
Per ottenere l'autorizzazione necessaria per aggiornare il target di concorrenza massima per una prenotazione, chiedi all'amministratore di concederti il ruolo IAM Editor risorse BigQuery (roles/bigquery.resourceEditor) nel progetto di amministrazione che mantiene la proprietà degli impegni.
Per saperne di più sulla concessione dei ruoli, vedi Gestire l'accesso a progetti, cartelle e organizzazioni.
Questo ruolo predefinito contiene l'autorizzazione
bigquery.reservations.update
,
necessaria per
aggiornare il target di concorrenza massima per una prenotazione.
Potresti anche ottenere questa autorizzazione con ruoli personalizzati o altri ruoli predefiniti.
Per saperne di più sui ruoli IAM in BigQuery, vedi Ruoli e autorizzazioni predefiniti.
Aggiornare il target di concorrenza massima per una prenotazione
Seleziona una delle seguenti opzioni:
Console
Nella Google Cloud console, vai alla pagina BigQuery.
Nel menu di navigazione, fai clic su Gestione della capacità.
Fai clic sulla scheda Prenotazioni di slot.
Trova la prenotazione che vuoi aggiornare.
Espandi l'opzione Azioni.
Fai clic su Modifica.
Per espandere la sezione Impostazioni avanzate, fai clic sulla freccia di espansione .
Per impostare la concorrenza target dei job, attiva il pulsante di attivazione/disattivazione Ignora la concorrenza automatica target dei job e inserisci la concorrenza target dei job.
Fai clic su Salva.
SQL
Per aggiornare il target di concorrenza massima per una prenotazione esistente, utilizza l'
ALTER RESERVATION istruzione DDL
e imposta il
target_job_concurrency campo.
Nella Google Cloud console, vai alla pagina BigQuery.
Nell'editor di query, inserisci la seguente istruzione:
ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME` SET OPTIONS ( target_job_concurrency = CONCURRENCY);
Sostituisci quanto segue:
-
ADMIN_PROJECT_ID: il progetto proprietario della prenotazione -
LOCATION: la località della prenotazione, ad esempioregion-us -
RESERVATION_NAME: il nome della prenotazione -
CONCURRENCY: il target di concorrenza massima
-
Fai clic su Esegui.
Per saperne di più su come eseguire le query, vedi Eseguire una query interattiva.
bq
Per aggiornare il target di concorrenza massima per una prenotazione esistente, esegui il
bq update comando:
bq update \
--project_id=ADMIN_PROJECT_ID \
--location=LOCATION \
--target_job_concurrency=CONCURRENCY \
--reservation \
RESERVATION_NAME
Sostituisci quanto segue:
ADMIN_PROJECT_ID: il progetto proprietario della prenotazioneLOCATION: la località della prenotazioneCONCURRENCY: il target di concorrenza massimaRESERVATION_NAME: il nome della prenotazione
API
Per aggiornare il target di concorrenza massima nell'
API BigQuery Reservation,
imposta il campo concurrency nella
risorsa di prenotazione
e chiama il
UpdateReservationRequest metodo.
Monitoraggio
Per scoprire quali query sono in esecuzione e quali sono in coda, consulta le
INFORMATION_SCHEMA.JOBS_BY_* e
INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
viste. Il campo state è impostato su RUNNING per le query in esecuzione attiva e su PENDING per le query in coda.
Per visualizzare il numero di query simultanee eseguite quando è stata raggiunta la soglia di concorrenza dinamica per ogni secondo dell'ultimo giorno, esegui la query seguente:
SELECT t1.period_start, t1.job_count AS dynamic_concurrency_threshold FROM ( SELECT period_start, state, COUNT(DISTINCT job_id) AS job_count FROM `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() AND reservation_id = "RESERVATION_ID" GROUP BY period_start, state) AS t1 JOIN ( SELECT period_start, state, COUNT(DISTINCT job_id) AS job_count FROM `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE state = "PENDING" AND period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() AND reservation_id = "RESERVATION_ID" GROUP BY period_start, state HAVING COUNT(DISTINCT job_id) > 0 ) AS t2 ON t1.period_start = t2.period_start WHERE t1.state = "RUNNING";
Sostituisci quanto segue:
PROJECT_ID: il nome del progetto in cui hai eseguito le queryREGION_ID: la località in cui sono state elaborate le queryRESERVATION_ID: il nome della prenotazione in cui sono in esecuzione le query
Puoi monitorare la lunghezza della coda delle query per la tua prenotazione utilizzando i grafici delle risorse amministrative di BigQuery e selezionando il grafico Concorrenza dei job con la metrica In attesa.
Puoi anche monitorare la lunghezza della coda in Cloud Monitoring visualizzando la metrica del conteggio dei job e filtrando in base al numero di job in stato In attesa.
Risolvere i problemi relativi a tempi di coda lunghi
Un job di query potrebbe sembrare lento perché trascorre una quantità significativa di tempo in attesa in una coda prima dell'inizio dell'esecuzione. Questa durata è il tempo di coda.
I job in coda mostrano lo stato PENDING.
Identificare tempi di coda lunghi
Puoi identificare tempi di coda lunghi utilizzando i seguenti metodi:
INFORMATION_SCHEMA: Le visteINFORMATION_SCHEMA.JOBS*possono fornire informazioni sui tempi di coda delle query. Ad esempio, puoi calcolare il tempo di coda per job specifici sottraendocreation_timedastart_time, o identificare i job constate="PENDING"per un periodo di tempo prolungato. La query di esempio può fungere da punto di partenza per osservare il carico delle query e identificare quando viene raggiunta la soglia di concorrenza dinamica.- Monitoraggio:
Utilizza la metrica
bigquery.googleapis.com/job/num_in_flightin Monitoring, filtrata in base astate=pending, per monitorare la lunghezza della coda nel tempo. - Puoi anche utilizzare i grafici delle risorse amministrative di BigQuery, come descritto nella sezione Monitoraggio.
Cause comuni
Il seguente elenco descrive alcune cause comuni di tempi di coda lunghi:
- Limiti di concorrenza: il progetto o la prenotazione ha raggiunto il numero massimo di query simultanee consentite, che viene determinato dinamicamente o configurato manualmente. Una volta raggiunto questo limite, le nuove query sono costrette ad attendere.
- Contesa di slot: non sono disponibili slot sufficienti per gestire il workload. Di conseguenza, le query in esecuzione attiva vengono eseguite più lentamente, occupando i relativi slot di query simultanee per periodi di tempo più lunghi e aumentando i tempi di coda per le altre query.
- Picchi di workload: si verifica un aumento improvviso del numero di query inviate.
- Query inefficienti: le singole query non sono ottimizzate. Anche quando il volume delle query è basso, queste query inefficienti possono continuare a consumare slot eccessivi per periodi di tempo prolungati, riducendo il tasso di turnover delle query attive. In questo modo, le nuove query non possono essere avviate e sono costrette ad attendere nella coda.
Risolvere i problemi relativi a tempi di coda lunghi
Per risolvere i problemi relativi a tempi di coda lunghi, valuta le seguenti azioni:
- Valuta il tuo workload: determina se il volume o la complessità delle query è aumentato di recente.
- Controlla l'utilizzo della prenotazione: utilizza i grafici delle risorse amministrative per verificare se la prenotazione raggiunge spesso il picco di utilizzo degli slot.
- Esamina la concorrenza: confronta il numero di query in esecuzione con il numero di query in attesa.
- Ottimizza e regola:
- Utilizza la priorità delle query batch per i workload meno sensibili al tempo, che hanno un limite di coda più elevato.
- Ottimizza le query a lunga esecuzione.
- Aumenta gli slot di prenotazione se raggiungi costantemente la capacità massima.
- Attenua i picchi di invio delle query.
- Se applicabile, regola il target di concorrenza massima per la prenotazione.
Limitazioni
- Ogni progetto on demand può mettere in coda fino a 1000 query interattive e 20.000 query batch contemporaneamente. Le query che superano questo limite restituiscono un errore di quota. Non puoi richiedere un aumento di questi limiti.
- All'interno di una prenotazione, ogni progetto assegnato a quella prenotazione può mettere in coda fino a 1000 query interattive e 20.000 query batch contemporaneamente. Le query che superano questo limite restituiscono un errore di quota. Non puoi richiedere un aumento di questi limiti.
- Per impostazione predefinita, i job di query che non hanno iniziato l'esecuzione vanno in timeout dopo 6 ore per le query interattive e 24 ore per le query batch.
- Non puoi impostare il target di concorrenza massima per le query eseguite in un progetto on demand.
- Non puoi impostare il target di concorrenza massima per le query eseguite con una prenotazione Standard Edition. Per saperne di più sulle versioni, vedi Introduzione alle versioni di BigQuery.
Passaggi successivi
- Scopri di più sulla diagnosi e sulla risoluzione degli errori relativi al limite della coda delle query.