Utilizzare le code di query

BigQuery determina automaticamente il numero di query che possono essere eseguite contemporaneamente, denominato 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 massimo e impostare il timeout della coda per query interattive e batch.

Panoramica

BigQuery determina dinamicamente il numero di query che possono essere eseguite contemporaneamente in base alle risorse di calcolo 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 una 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:

202 query simultanee, seguite dalle query in coda e poi dalle query che restituiscono un errore.

Per le prenotazioni, hai la possibilità di impostare il target di concorrenza massimo, un limite superiore al numero di query che possono essere eseguite contemporaneamente in una prenotazione, per garantire che a ogni query venga assegnato un numero minimo di slot. Non puoi specificare un target di concorrenza massima per un progetto on demand; viene sempre calcolato in modo dinamico.

Comportamento di accodamento

BigQuery applica la pianificazione equa per garantire che nessun singolo progetto possa consumare tutti gli slot di 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 le altre query sono in coda. Una query dal progetto B verrà rimossa dalla coda per prima anche se è stata inviata dopo la query dal progetto A. Dopo l'inizio dell'esecuzione di una query, questa 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 o prenotazione on demand. Se il numero di query batch in esecuzione contemporaneamente raggiunge questo massimo, le query interattive vengono assegnate la priorità anche se sono state inviate in un secondo momento.

Quando elimini una prenotazione, tutte le query in coda scadono. 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 vengono inviate 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. Se vuoi, puoi annullare i singoli job di query in esecuzione o in coda.

Timeout della coda di controllo

Per controllare il timeout della coda per le query interattive o batch, utilizza l'istruzione ALTER PROJECT SET OPTIONS o l'istruzione ALTER ORGANIZATION SET OPTIONS 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 vista INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS.

Per disattivare l'inserimento in coda, 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.

Imposta il target di contemporaneità massimo

Puoi impostare manualmente il target di concorrenza massima quando crei una prenotazione. Per impostazione predefinita, la concorrenza massima target è 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 che vengono 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 calcolo 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, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene l'autorizzazione bigquery.reservations.create 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.

Imposta il target di concorrenza massimo per una prenotazione

Seleziona una delle seguenti opzioni:

Console

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel menu di navigazione, fai clic su Gestione della capacità.

  3. Fai clic su Crea prenotazione.

  4. Seleziona le impostazioni di prenotazione.

  5. Per espandere la sezione Impostazioni avanzate, fai clic sulla freccia di espansione .

  6. Per impostare la concorrenza target dei job, fai clic sul pulsante di attivazione/disattivazione Ignora la concorrenza automatica target dei job e inserisci la concorrenza target dei job.

  7. Fai clic su Salva.

SQL

Per impostare il target di concorrenza massimo per una nuova prenotazione, utilizza l'istruzione DDL CREATE RESERVATION e imposta il campo target_job_concurrency.

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. 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 esempio region-us
    • RESERVATION_NAME: il nome della prenotazione
    • CONCURRENCY: il target di concorrenza massimo

  3. Fai clic su Esegui.

Per maggiori informazioni su come eseguire le query, consulta Eseguire una query interattiva.

bq

Per impostare il target di contemporaneità massimo per una nuova prenotazione, esegui il comando bq mk:

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 prenotazione
  • LOCATION: la posizione della prenotazione
  • CONCURRENCY: il target di concorrenza massimo
  • RESERVATION_NAME: il nome della prenotazione

API

Per impostare la concorrenza massima target nell'API BigQuery Reservation, imposta il campo concurrency nella risorsa di prenotazione e chiama il metodo CreateReservationRequest.

Aggiorna 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 calcolo disponibili. Se riduci il target di concorrenza massima, le query in esecuzione 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 la concorrenza massima target su 0, BigQuery determina dinamicamente la concorrenza in base alle risorse disponibili (il comportamento predefinito).

Ruoli obbligatori

Per ottenere l'autorizzazione necessaria per aggiornare la destinazione di concorrenza massima per una prenotazione, chiedi all'amministratore di concederti il ruolo IAM Editor risorse BigQuery (roles/bigquery.resourceEditor) nel progetto amministratore che mantiene la proprietà degli impegni. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene l'autorizzazione bigquery.reservations.update necessaria per aggiornare la destinazione 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.

Aggiorna la contemporaneità massima target per una prenotazione

Seleziona una delle seguenti opzioni:

Console

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel menu di navigazione, fai clic su Gestione della capacità.

  3. Fai clic sulla scheda Prenotazioni slot.

  4. Trova la prenotazione che vuoi aggiornare.

  5. Espandi l'opzione Azioni.

  6. Fai clic su Modifica.

  7. Per espandere la sezione Impostazioni avanzate, fai clic sulla freccia di espansione .

  8. Per impostare la concorrenza target dei job, fai clic sul pulsante di attivazione/disattivazione Ignora la concorrenza automatica target dei job e inserisci la concorrenza target dei job.

  9. Fai clic su Salva.

SQL

Per aggiornare la concorrenza massima target per una prenotazione esistente, utilizza l'istruzione DDL ALTER RESERVATION e imposta il campo target_job_concurrency.

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. 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 esempio region-us
    • RESERVATION_NAME: il nome della prenotazione
    • CONCURRENCY: il target di concorrenza massimo

  3. Fai clic su Esegui.

Per maggiori informazioni su come eseguire le query, consulta Eseguire una query interattiva.

bq

Per aggiornare il target di concorrenza massimo per una prenotazione esistente, esegui il comando bq update:

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 prenotazione
  • LOCATION: la posizione della prenotazione
  • CONCURRENCY: il target di concorrenza massimo
  • RESERVATION_NAME: il nome della prenotazione

API

Per aggiornare la destinazione di concorrenza massima nell'API BigQuery Reservation, imposta il campo concurrency nella risorsa di prenotazione e chiama il metodo UpdateReservationRequest.

Monitoraggio

Per scoprire quali query sono in esecuzione e quali sono in coda, consulta le visualizzazioni INFORMATION_SCHEMA.JOBS_BY_* e INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*. 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 seguente query:

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 query
  • REGION_ID: la località in cui sono state elaborate le query
  • RESERVATION_ID: il nome della prenotazione in cui vengono eseguite le query

Puoi monitorare la lunghezza della coda di query per la tua prenotazione utilizzando i grafici delle risorse amministrative di BigQuery e selezionando il grafico Concurrency dei job con la metrica In attesa.

Lunghezza della coda nei grafici delle risorse amministrative.

Puoi anche monitorare la lunghezza della coda in Cloud Monitoring visualizzando la metrica Conteggio job e filtrando in base al numero di job in stato In attesa.

Lunghezza della coda in Cloud Monitoring.

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 sono stati avviati scadono dopo 6 ore per le query interattive e 24 ore per le query batch.
  • Non puoi impostare il target di concorrenza massimo per le query eseguite in un progetto on demand.
  • Non puoi impostare il target di concorrenza massimo per le query eseguite con una prenotazione della versione Standard. Per ulteriori informazioni sulle versioni, vedi Introduzione alle versioni di BigQuery.

Passaggi successivi