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 :
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.
En plus du nombre total de requêtes simultanées, BigQuery détermine de manière dynamique le nombre maximal de requêtes par lot simultanées à exécuter par projet à la demande ou réservation. Si le nombre de requêtes par lot exécutées simultanément atteint ce maximum, les requêtes interactives sont prioritaires, même si elles ont été soumises ultérieurement.
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 page Gérer l'accès aux projets, aux dossiers et aux organisations.
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
Dans la console Google Cloud, accédez à la page "BigQuery".
Dans le menu de navigation, accédez à la section Gestion de la capacité.
Cliquez sur Créer une réservation.
Sélectionnez vos paramètres de réservation.
Pour développer la section Paramètres avancés, cliquez sur la flèche de développement
.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.
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
.
Dans la console Google Cloud, accédez à la page BigQuery.
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
-
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é maximaleRESERVATION_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 page Gérer l'accès aux projets, aux dossiers et aux organisations.
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
Dans la console Google Cloud, accédez à la page "BigQuery".
Dans le menu de navigation, accédez à la section Gestion de la capacité.
Cliquez sur l'onglet Réservations d'emplacements.
Recherchez la réservation que vous souhaitez mettre à jour.
Développez l'option
Actions.Cliquez sur Modifier.
Pour développer la section Paramètres avancés, cliquez sur la flèche de développement
.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.
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
.
Dans la console Google Cloud, accédez à la page BigQuery.
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
-
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é maximaleRESERVATION_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.
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.
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
- Découvrez comment diagnostiquer et résoudre les erreurs liées aux limites de file d'attente des requêtes.