Usar colas de consultas

BigQuery determina automáticamente el número de consultas que se pueden ejecutar simultáneamente, lo que se denomina concurrencia dinámica. Las consultas adicionales se ponen en cola hasta que haya recursos de procesamiento disponibles. En este documento se explica cómo controlar el objetivo de simultaneidad máxima y cómo definir el tiempo de espera de la cola para las consultas interactivas y por lotes.

Información general

BigQuery determina de forma dinámica el número de consultas que se pueden ejecutar simultáneamente en función de los recursos de computación disponibles. El número de consultas que se pueden ejecutar simultáneamente se calcula por proyecto bajo demanda o por reserva. Las consultas adicionales se colocan en una cola hasta que haya capacidad suficiente para empezar a ejecutarlas. La longitud de la cola está limitada a 1000 consultas interactivas y 20.000 consultas por lotes por proyecto y región, independientemente de si el proyecto es bajo demanda o usa una reserva. En el siguiente ejemplo se muestra el comportamiento de un proyecto bajo demanda cuando la simultaneidad de consultas calculada es 202:

202 consultas simultáneas, seguidas de consultas en cola y, por último, consultas que devuelven un error.

En las reservas, puede definir el objetivo de simultaneidad máxima, un límite superior del número de consultas que se pueden ejecutar simultáneamente en una reserva, para asegurarse de que a cada consulta se le asigne un número mínimo de ranuras. No puedes especificar un objetivo de simultaneidad máxima para un proyecto bajo demanda, ya que siempre se calcula de forma dinámica.

Comportamiento de las colas

BigQuery aplica una programación equitativa para asegurarse de que ningún proyecto pueda consumir todas las ranuras de una reserva.

Las consultas de los proyectos que tienen la menor proporción de simultaneidad se ponen en cola primero. Durante la ejecución, las ranuras se distribuyen de forma equitativa entre los proyectos antes de distribuirse entre las tareas de cada proyecto.

Por ejemplo, supongamos que tienes una reserva asignada a dos proyectos: A y B. BigQuery calcula el valor 5 para la simultaneidad de la reserva. El proyecto A tiene cuatro consultas en ejecución simultáneamente, el proyecto B tiene una consulta en ejecución y otras consultas están en cola. Una consulta del proyecto B se pondría en cola antes aunque se hubiera enviado después de la consulta del proyecto A. Cuando empieza a ejecutarse una consulta, recibe una parte equitativa de las ranuras de la reserva compartida.

Además del número total de consultas simultáneas, BigQuery determina de forma dinámica el número máximo de consultas por lotes simultáneas que se pueden ejecutar por proyecto bajo demanda o reserva. Si el número de consultas por lotes que se están ejecutando simultáneamente alcanza este máximo, se priorizarán las consultas interactivas aunque se hayan enviado más tarde.

Cuando eliminas una reserva, se agota el tiempo de espera de todas las consultas en cola. Cuando se reasigna un proyecto asignado a una reserva a otra reserva, todas las solicitudes que estén en cola o en curso seguirán haciéndolo en la reserva antigua, mientras que todas las solicitudes nuevas irán a la nueva reserva. Cuando se quita de una reserva un proyecto asignado a ella, las consultas en curso continúan en la reserva, mientras que las solicitudes nuevas y en cola se ejecutan con el modelo bajo demanda. También puedes cancelar tareas de consulta individuales en curso o en cola.

Tiempo de espera de la cola de control

Para controlar el tiempo de espera de la cola de las consultas interactivas o por lotes, usa la sentencia ALTER PROJECT SET OPTIONS o la sentencia ALTER ORGANIZATION SET OPTIONS para definir los campos default_interactive_query_queue_timeout_ms o default_batch_query_queue_timeout_ms en la configuración predeterminada de tu proyecto u organización.

Para ver el tiempo de espera de las consultas interactivas o por lotes de tu proyecto, consulta la vista INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS.

Para desactivar la cola, asigna el valor -1 al tiempo de espera de la cola. Si alcanzas la simultaneidad máxima de consultas, las consultas adicionales fallarán y se mostrará un error ADMISSION_DENIED.

Definir el objetivo de simultaneidad máximo

Puedes definir manualmente el objetivo de simultaneidad máxima al crear una reserva. De forma predeterminada, el objetivo de simultaneidad máximo es cero, lo que significa que BigQuery determina de forma dinámica la simultaneidad en función de los recursos disponibles. De lo contrario, si defines un objetivo distinto de cero, el objetivo de simultaneidad máxima especifica un límite superior del número de consultas que se ejecutan simultáneamente en una reserva, lo que garantiza una cantidad mínima de capacidad de ranura disponible para cada consulta que se ejecute.

Aumentar el objetivo de simultaneidad máxima no garantiza que se ejecuten más consultas simultáneamente. La simultaneidad real depende de los recursos informáticos disponibles, que se pueden aumentar añadiendo más ranuras a la reserva.

Roles obligatorios

Para obtener el permiso que necesitas para definir la simultaneidad en una reserva nueva, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Editor de recursos de BigQuery (roles/bigquery.resourceEditor) en el proyecto de administración que mantiene la propiedad de los compromisos. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso bigquery.reservations.create, que es necesario para definir la simultaneidad en una reserva nueva.

También puedes obtener este permiso con roles personalizados u otros roles predefinidos.

Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery, consulta el artículo sobre roles y permisos predefinidos.

Definir el objetivo de simultaneidad máximo de una reserva

Selecciona una de las opciones siguientes:

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el menú de navegación, haz clic en Gestión de la capacidad.

  3. Haz clic en Crear reserva.

  4. Selecciona la configuración de la reserva.

  5. Para desplegar la sección Configuración avanzada, haz clic en la flecha de expansión.

  6. Para definir la simultaneidad de tareas objetivo, activa el interruptor Anular simultaneidad de tareas objetivo automática e introduce el valor de Simultaneidad de tareas objetivo.

  7. Haz clic en Guardar.

SQL

Para definir el objetivo de simultaneidad máxima de una nueva reserva, usa la CREATE RESERVATIONdeclaración de DDL y define el campo target_job_concurrency.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
      OPTIONS (
        target_job_concurrency = CONCURRENCY);

    Haz los cambios siguientes:

    • ADMIN_PROJECT_ID: el proyecto al que pertenece la reserva
    • LOCATION: la ubicación de la reserva, como region-us
    • RESERVATION_NAME: el nombre de la reserva
    • CONCURRENCY: el objetivo de simultaneidad máximo

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

bq

Para definir el objetivo de simultaneidad máxima de una nueva reserva, ejecuta el comando bq mk:

bq mk \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

Haz los cambios siguientes:

  • ADMIN_PROJECT_ID: el proyecto al que pertenece la reserva
  • LOCATION: la ubicación de la reserva
  • CONCURRENCY: el objetivo de simultaneidad máximo
  • RESERVATION_NAME: el nombre de la reserva

API

Para definir el objetivo de simultaneidad máxima en la API Reservation de BigQuery, asigna el valor concurrency al campo recurso de reserva y llama al método CreateReservationRequest.

Actualizar el objetivo de simultaneidad máxima

Puedes actualizar el objetivo de simultaneidad máxima de una reserva en cualquier momento. Sin embargo, aumentar el objetivo no garantiza que se ejecuten más consultas simultáneamente. La simultaneidad real depende de los recursos de computación disponibles. Si reduces el objetivo de simultaneidad máxima, las consultas que se estén ejecutando no se verán afectadas y las consultas en cola no se ejecutarán hasta que el número de consultas simultáneas sea inferior al nuevo objetivo.

Si defines el objetivo de simultaneidad máxima en 0, BigQuery determinará dinámicamente la simultaneidad en función de los recursos disponibles (el comportamiento predeterminado).

Roles obligatorios

Para obtener el permiso que necesitas para actualizar el objetivo de simultaneidad máxima de una reserva, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Editor de recursos de BigQuery (roles/bigquery.resourceEditor) en el proyecto de administración que mantiene la propiedad de los compromisos. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso bigquery.reservations.update, que es necesario para actualizar el objetivo de simultaneidad máximo de una reserva.

También puedes obtener este permiso con roles personalizados u otros roles predefinidos.

Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery, consulta el artículo sobre roles y permisos predefinidos.

Actualizar el objetivo de simultaneidad máximo de una reserva

Selecciona una de las opciones siguientes:

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el menú de navegación, haz clic en Gestión de la capacidad.

  3. Haz clic en la pestaña Reservas de espacios.

  4. Busca la reserva que quieras modificar.

  5. Abre la opción Acciones.

  6. Haz clic en Editar.

  7. Para desplegar la sección Configuración avanzada, haz clic en la flecha de expansión.

  8. Para definir la simultaneidad de tareas objetivo, activa el interruptor Anular simultaneidad de tareas objetivo automática e introduce el valor de Simultaneidad de tareas objetivo.

  9. Haz clic en Guardar.

SQL

Para actualizar el objetivo de simultaneidad máxima de una reserva, usa la ALTER RESERVATION instrucción DDL y define el campo target_job_concurrency.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      target_job_concurrency = CONCURRENCY);

    Haz los cambios siguientes:

    • ADMIN_PROJECT_ID: el proyecto al que pertenece la reserva
    • LOCATION: la ubicación de la reserva, como region-us
    • RESERVATION_NAME: el nombre de la reserva
    • CONCURRENCY: el objetivo de simultaneidad máximo

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

bq

Para actualizar el objetivo de simultaneidad máxima de una reserva, ejecuta el comando bq update:

bq update \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

Haz los cambios siguientes:

  • ADMIN_PROJECT_ID: el proyecto al que pertenece la reserva
  • LOCATION: la ubicación de la reserva
  • CONCURRENCY: el objetivo de simultaneidad máximo
  • RESERVATION_NAME: el nombre de la reserva

API

Para actualizar el objetivo de simultaneidad máxima en la API de reserva de BigQuery, define el campo concurrency en el recurso de reserva y llama al método UpdateReservationRequest.

Supervisión

Para saber qué consultas se están ejecutando y cuáles están en cola, consulta las vistas INFORMATION_SCHEMA.JOBS_BY_* y INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*. El campo state se define como RUNNING para las consultas que se están ejecutando y como PENDING para las consultas en cola.

Para ver cuántas consultas simultáneas se ejecutaron cuando se alcanzó el umbral de simultaneidad dinámica cada segundo del último día, ejecuta la siguiente consulta:

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";

Haz los cambios siguientes:

  • PROJECT_ID: el nombre del proyecto en el que has ejecutado las consultas
  • REGION_ID: la ubicación en la que se procesaron las consultas
  • RESERVATION_ID: el nombre de la reserva en la que se ejecutan las consultas

Para monitorizar la longitud de la cola de consultas de tu reserva, puedes usar los gráficos de recursos administrativos de BigQuery y seleccionar el gráfico Simultaneidad de tareas con la métrica Pendiente.

Longitud de la cola en los gráficos de recursos administrativos.

También puedes monitorizar la longitud de la cola en Cloud Monitoring. Para ello, consulta la métrica Número de tareas y filtra por el número de tareas en estado Pendiente.

Longitud de la cola en Cloud Monitoring.

Limitaciones

  • Cada proyecto bajo demanda puede poner en cola hasta 1000 consultas interactivas y 20.000 consultas por lotes a la vez. Las consultas que superen este límite devolverán un error de cuota. No puedes solicitar un aumento de estos límites.
  • En una reserva, cada proyecto asignado a esa reserva puede poner en cola hasta 1000 consultas interactivas y 20.000 consultas por lotes a la vez. Las consultas que superen este límite devolverán un error de cuota. No puedes solicitar un aumento de estos límites.
  • De forma predeterminada, las tareas de consulta que no se han iniciado se agotan tras 6 horas en el caso de las consultas interactivas y tras 24 horas en el de las consultas por lotes.
  • No puedes definir el objetivo de simultaneidad máxima para las consultas que se ejecutan en un proyecto bajo demanda.
  • No puedes definir el objetivo de simultaneidad máxima para las consultas que se ejecutan con una reserva de edición Estándar. Para obtener más información sobre las ediciones, consulta la introducción a las ediciones de BigQuery.

Siguientes pasos