Utiliser des files d'attente de requêtes

BigQuery détermine automatiquement le nombre de requêtes pouvant s'exécuter simultanément (également appelé la simultanéité dynamique). Les requêtes supplémentaires sont mises en file d'attente jusqu'à ce que les ressources de traitement soient disponibles. Ce document explique comment contrôler la cible de simultanéité maximale et définir le délai avant expiration de la file d'attente pour les requêtes interactives et par lot.

Présentation

BigQuery détermine de façon dynamique le nombre de requêtes pouvant s'exécuter simultanément en fonction des ressources de calcul disponibles. Le nombre de requêtes pouvant être exécutées simultanément est calculé par projet à la demande ou par réservation. Les requêtes supplémentaires sont placées dans une file d'attente jusqu'à ce que la capacité disponible soit suffisante pour commencer l'exécution. La longueur de la file d'attente est limitée à 20 000 requêtes par lot et 1 000 requêtes interactives par projet et par région, qu'il s'agisse d'un projet à la demande ou d'une réservation. L'exemple suivant illustre le comportement d'un projet à la demande lorsque la simultanéité de requête calculée est égale à 202 :

202 requêtes simultanées, suivies de requêtes en file d'attente, suivies de requêtes renvoyant une erreur.

Pour les réservations, vous pouvez définir la cible de simultanéité maximale, une limite supérieure du nombre de requêtes pouvant s'exécuter simultanément dans une réservation, afin de vous assurer qu'un nombre minimal d'emplacements est attribué à chaque requête. Vous ne pouvez pas spécifier de cible de simultanéité maximale pour un projet à la demande. Elle est toujours calculée de manière dynamique.

Comportement de mise en file d'attente

BigQuery applique une planification équitable pour garantir qu'aucun projet unique ne peut utiliser tous les emplacements d'une réservation.

Les requêtes des projets ayant la plus petite part de simultanéité sont retirées de la file d'attente en premier. Pendant l'exécution, les emplacements sont répartis équitablement entre les projets avant d'être répartis entre les tâches au sein d'un projet.

Par exemple, supposons que vous ayez une réservation attribuée à deux projets : A et B. BigQuery calcule 5 pour la simultanéité de la réservation. Le projet A a quatre requêtes qui s'exécutent simultanément, le projet B a une requête en cours d'exécution, et les autres requêtes sont mises en file d'attente. Une requête du projet B est retirée de la file d'attente en premier, même si elle a été envoyée après la requête du projet A. Une fois que l'exécution d'une requête commence, elle reçoit une part équitable d'emplacements dans la réservation partagée.

Les jobs de requête d'un projet à la demande sont exécutés dans l'ordre dans lequel ils sont soumis.

BigQuery détermine de façon dynamique le nombre maximal de requêtes par lot exécutées simultanément par projet.

Lorsque vous supprimez une réservation, toutes les requêtes en file d'attente expirent. Lorsqu'un projet attribué à une réservation est réaffecté à une autre réservation, toutes les requêtes en file d'attente ou en cours d'exécution continuent de le faire dans l'ancienne réservation, tandis que toutes les nouvelles requêtes sont dirigées vers la nouvelle réservation. Lorsqu'un projet attribué à une réservation est supprimé de la réservation, les requêtes en cours continuent d'être traitées dans la réservation, tandis que les nouvelles requêtes et les requêtes en file d'attente s'exécutent à l'aide du modèle à la demande. Vous pouvez éventuellement annuler les jobs de requête en cours d'exécution ou en file d'attente.

Contrôler le délai avant expiration d'une file d'attente

Pour contrôler le délai avant expiration de la file d'attente pour des requêtes interactives ou par lot, utilisez l'instruction ALTER PROJECT SET OPTIONS ou l'instruction ALTER ORGANIZATION SET OPTIONS pour définir les champs default_interactive_query_queue_timeout_ms ou default_batch_query_queue_timeout_ms dans la configuration par défaut de votre projet ou de votre organisation.

Pour afficher le délai avant expiration de la file d'attente pour des requêtes interactives ou par lot dans votre projet, interrogez la vue INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS.

Pour désactiver la mise en file d'attente, définissez le délai avant expiration de la file d'attente sur -1. Si vous atteignez le nombre maximal de requêtes simultanées, les requêtes supplémentaires échouent avec une erreur ADMISSION_DENIED.

Définir la cible de simultanéité maximale

Vous pouvez définir manuellement la cible de simultanéité maximale lorsque vous créez une réservation. Par défaut, la cible de simultanéité maximale est égale à zéro, ce qui signifie que BigQuery détermine dynamiquement la simultanéité en fonction des ressources disponibles. Sinon, si vous définissez une cible non nulle, la cible de simultanéité maximale spécifie une limite supérieure du nombre de requêtes exécutées simultanément dans une réservation, ce qui garantit une quantité minimale d'emplacements disponibles pour chaque requête qui s'exécute.

L'augmentation de la cible de simultanéité maximale ne garantit pas l'exécution simultanée de davantage de requêtes. La simultanéité réelle dépend des ressources de calcul disponibles, qui peuvent être augmentées en ajoutant des emplacements à votre réservation.

Rôles requis

Pour obtenir l'autorisation dont vous avez besoin pour définir la simultanéité dans une nouvelle réservation, demandez à votre administrateur de vous accorder le rôle IAM Éditeur de ressources BigQuery (roles/bigquery.resourceEditor) sur le projet d'administration qui gère la propriété des engagements. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Ce rôle prédéfini contient l'autorisation bigquery.reservations.create, qui est nécessaire pour définir la simultanéité dans une nouvelle réservation.

Vous pouvez également obtenir cette autorisation avec des rôles personnalisés ou d'autres rôles prédéfinis.

Pour en savoir plus sur les rôles IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Définir la cible de simultanéité maximale d'une réservation

Sélectionnez l'une des options suivantes :

Console

  1. Dans la console Google Cloud, accédez à la page "BigQuery".

    Accéder à BigQuery

  2. Dans le menu de navigation, accédez à la section Gestion de la capacité.

  3. Cliquez sur Créer une réservation.

  4. Sélectionnez vos paramètres de réservation.

  5. Pour développer la section Paramètres avancés, cliquez sur la flèche de développement .

  6. Pour définir la simultanéité de job cible, cliquez sur le bouton Ignorer la simultanéité de job cible automatique et saisissez la simultanéité de job cible.

  7. Cliquez sur Enregistrer.

SQL

Pour définir la cible de simultanéité maximale pour une nouvelle réservation, utilisez l'instruction LDD CREATE RESERVATION et définissez le champ target_job_concurrency.

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez les éléments suivants :

    • ADMIN_PROJECT_ID : projet propriétaire de la réservation.
    • LOCATION : emplacement de la réservation (par exemple, region-us).
    • RESERVATION_NAME : nom de la réservation.
    • CONCURRENCY : cible de simultanéité maximale

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

Pour définir la cible de simultanéité maximale pour une nouvelle réservation, exécutez la commande bq mk :

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

Remplacez les éléments suivants :

  • ADMIN_PROJECT_ID : projet propriétaire de la réservation.
  • LOCATION : emplacement de la réservation.
  • CONCURRENCY : cible de simultanéité maximale
  • RESERVATION_NAME : nom de la réservation.

API

Pour définir la cible de simultanéité maximale dans l'API BigQuery Reservation, définissez le champ concurrency dans la ressource de réservation, puis appelez la méthode CreateReservationRequest.

Mettre à jour la cible de simultanéité maximale

Vous pouvez mettre à jour la cible de simultanéité maximale pour une réservation à tout moment. Cependant, l'augmentation de la cible ne garantit pas l'exécution simultanée de davantage de requêtes. La simultanéité réelle dépend des ressources de calcul disponibles. Si vous réduisez la cible de simultanéité maximale, les requêtes en cours d'exécution ne sont pas affectées, et les requêtes en file d'attente ne s'exécutent pas tant que le nombre de requêtes simultanées n'atteint pas la nouvelle cible.

Si vous définissez la cible de simultanéité maximale sur 0, BigQuery détermine dynamiquement la simultanéité en fonction des ressources disponibles (comportement par défaut).

Rôles requis

Pour obtenir l'autorisation dont vous avez besoin pour mettre à jour la cible de simultanéité maximale d'une réservation, demandez à votre administrateur de vous accorder le rôle IAM Éditeur de ressources BigQuery (roles/bigquery.resourceEditor) sur le projet d'administration qui gère la propriété des engagements. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Ce rôle prédéfini contient l'autorisation bigquery.reservations.update, qui est nécessaire pour mettre à jour la cible de simultanéité maximale d'une réservation.

Vous pouvez également obtenir cette autorisation avec des rôles personnalisés ou d'autres rôles prédéfinis.

Pour en savoir plus sur les rôles IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Mettre à jour la cible de simultanéité maximale d'une réservation

Sélectionnez l'une des options suivantes :

Console

  1. Dans la console Google Cloud, accédez à la page "BigQuery".

    Accéder à BigQuery

  2. Dans le menu de navigation, accédez à la section Gestion de la capacité.

  3. Cliquez sur l'onglet Réservations d'emplacements.

  4. Recherchez la réservation que vous souhaitez mettre à jour.

  5. Développez l'option Actions.

  6. Cliquez sur Modifier.

  7. Pour développer la section Paramètres avancés, cliquez sur la flèche de développement .

  8. Pour définir la simultanéité de job cible, cliquez sur le bouton Ignorer la simultanéité de job cible automatique et saisissez la simultanéité de job cible.

  9. Cliquez sur Enregistrer.

SQL

Pour mettre à jour la cible de simultanéité maximale pour une réservation existante, utilisez l'instruction LDD ALTER RESERVATION et définissez le champ target_job_concurrency.

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez les éléments suivants :

    • ADMIN_PROJECT_ID : projet propriétaire de la réservation.
    • LOCATION : emplacement de la réservation (par exemple, region-us).
    • RESERVATION_NAME : nom de la réservation.
    • CONCURRENCY : cible de simultanéité maximale

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

Pour mettre à jour la cible de simultanéité maximale pour une réservation existante, exécutez la commande bq update :

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

Remplacez les éléments suivants :

  • ADMIN_PROJECT_ID : projet propriétaire de la réservation.
  • LOCATION : emplacement de la réservation.
  • CONCURRENCY : cible de simultanéité maximale
  • RESERVATION_NAME : nom de la réservation.

API

Pour mettre à jour la cible de simultanéité maximale dans l'API BigQuery Reservation, définissez le champ concurrency dans la ressource de réservation, puis appelez la méthode UpdateReservationRequest.

Surveillance

Pour connaître les requêtes en cours d'exécution et en file d'attente, consultez les vues INFORMATION_SCHEMA.JOBS_BY_* et INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*. Le champ state est défini sur RUNNING pour les requêtes en cours d'exécution et sur PENDING pour les requêtes en file d'attente.

Pour afficher le nombre de requêtes exécutées simultanément lorsque le seuil de simultanéité dynamique a été atteint pour chaque seconde au cours du dernier jour, exécutez la requête suivante :

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

Remplacez les éléments suivants :

  • PROJECT_ID : nom du projet dans lequel vous avez exécuté les requêtes.
  • REGION_ID : emplacement où les requêtes ont été traitées.
  • RESERVATION_ID : nom de la réservation dans laquelle les requêtes sont exécutées.

Vous pouvez surveiller la longueur de la file d'attente des requêtes pour votre réservation à l'aide des graphiques de ressources d'administration de BigQuery et en sélectionnant le graphique Simultanéité des jobs avec la métrique En attente.

Longueur de la file d'attente dans les graphiques de ressources d'administration.

Vous pouvez également surveiller la longueur de la file d'attente dans Cloud Monitoring en affichant la métrique Nombre de jobs et en activant le filtrage par nombre de jobs en attente.

Longueur de la file d'attente dans Cloud Monitoring.

Limites

  • Chaque projet à la demande peut placer en file d'attente jusqu'à 1 000 requêtes interactives et 20 000 requêtes par lot à la fois. Les requêtes qui dépassent cette limite renvoient une erreur de quota. Vous ne pouvez pas demander une augmentation de ces limites.
  • Dans une réservation, chaque projet attribué à cette réservation peut placer en file d'attente jusqu'à 1 000 requêtes interactives et 20 000 requêtes par lot à la fois. Les requêtes qui dépassent cette limite renvoient une erreur de quota. Vous ne pouvez pas demander une augmentation de ces limites.
  • Par défaut, les jobs de requêtes qui n'ont pas démarré d'exécution expirent au bout de six heures pour les requêtes interactives et 24 heures pour les requêtes par lot.
  • Vous ne pouvez pas définir la cible de simultanéité maximale pour les requêtes exécutées dans un projet à la demande.
  • Vous ne pouvez pas définir la cible de simultanéité maximale pour les requêtes exécutées avec une réservation en édition Standard. Pour en savoir plus sur les éditions, consultez la page Présentation des éditions BigQuery.

Étapes suivantes