Résoudre les erreurs de quota BigQuery

BigQuery comprend différents quotas qui limitent le taux et le volume des requêtes entrantes. Ces quotas permettent à la fois de protéger les systèmes backend et d'éviter toute facturation inattendue si vous envoyez des tâches très volumineuses. Ce document explique comment diagnostiquer et limiter les erreurs résultant de quotas.

Présentation

Si une opération BigQuery échoue en raison d'une limite de quota, l'API renvoie le code d'état HTTP 403 Forbidden. Le corps de la réponse contient plus d'informations sur la limite qui a été atteinte. Le corps de la réponse ressemble à ce qui suit :

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Quota exceeded: ...",
    "reason" : "quotaExceeded"
  } ],
  "message" : "Quota exceeded: ..."
}

Le champ message de la charge utile décrit la limite qui a été dépassée. Par exemple, le champ message peut indiquer Exceeded rate limits: too many table update operations for this table.

En général, les limites de quota appartiennent à deux catégories, indiquées par le champ reason dans la charge utile de la réponse.

  • rateLimitExceeded : cette valeur indique une limite à court terme. Généralement, vous pouvez résoudre ces limites en réessayant l'opération après quelques secondes. Utilisez un intervalle exponentiel entre les tentatives. Autrement dit, augmentez le délai entre chaque tentative, de manière exponentielle.

  • quotaExceeded : cette valeur indique une limite à plus long terme. Si vous atteignez une limite de quota à plus long terme, vous devez attendre au moins 10 minutes avant de réessayer l'opération. Si vous atteignez régulièrement l'une de ces limites de quota à plus long terme, vous devez analyser votre charge de travail pour identifier et limiter le problème. Vous pouvez par exemple optimiser votre charge de travail ou demander une augmentation du quota.

Pour les erreurs quotaExceeded, examinez le message d'erreur pour comprendre quelle limite de quota a été dépassée. Analysez ensuite votre charge de travail pour voir si vous pouvez éviter de l'atteindre, par exemple en optimisant les performances des requêtes. Dans certains cas, le quota peut être augmenté en contactant l'assistance BigQuery ou en contactant l'équipe commerciale Google Cloud.

Vous pouvez utiliser les vues INFORMATION_SCHEMA pour analyser le problème sous-jacent. Ces vues contiennent des métadonnées sur vos ressources BigQuery, y compris les tâches, les réservations et les insertions en flux continu. Par exemple, la requête suivante utilise la vue JOBS_BY_PROJECT pour répertorier toutes les erreurs liées aux quotas au cours des dernières 24 heures.

SELECT
 job_id,
 creation_time,
 error_result
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) AND
      error_result.reason IN ('rateLimitExceeded', 'quotaExceeded')

Vous pouvez également consulter les erreurs dans les journaux d'audit Cloud. Par exemple, à l'aide de la visionneuse de journaux, la requête suivante détecte des erreurs avec Quota exceeded dans la chaîne du message :

resource.type = ("bigquery_project" OR "bigquery_dataset")
protoPayload.status.code ="7"
protoPayload.status.message: "Quota exceeded"

(Le code d'état 7 est PERMISSION_DENIED, ce qui correspond au code d'état HTTP 403.)

Erreurs de quota d'insertion en flux continu

Cette section donne des conseils pour résoudre les erreurs de quota liées à l'insertion de données en flux continu dans BigQuery.

Dans certaines régions, les insertions en flux continu ont un quota plus élevé si vous ne remplissez pas le champ insertId pour chaque ligne. Pour en savoir plus sur les quotas d'insertion en flux continu, consultez la section Insertions en flux continu. Les erreurs liées aux quotas d'insertion en flux continu dans BigQuery dépendent de la présence ou de l'absence de insertId.

Si le champ insertId est vide, l'erreur de quota suivante est possible :

Limite de quota Message d'erreur
Octets par seconde et par projet Votre entité avec gaia_id : GAIA_ID, projet : PROJECT_ID dans la région : REGION a dépassé le quota d'insertion d'octets par seconde.

Si le champ insertId est renseigné, les erreurs de quota suivantes sont possibles :

Limite de quota Message d'erreur
Lignes par seconde et par projet Votre projet PROJECT_ID dans REGION a dépassé le quota d'insertion en flux continu de lignes par seconde.
Lignes par seconde et par table Votre table TABLE_ID a dépassé le quota d'insertion en flux continu de lignes par seconde.
Octets par seconde et par table Votre table TABLE_ID a dépassé le quota d'insertion en flux continu d'octets par seconde.

Le champ insertId permet de dédupliquer les lignes insérées. Si plusieurs insertions avec le même insertId arrivent dans un intervalle de quelques minutes, BigQuery écrit une seule version de l'enregistrement. Cependant, cette déduplication automatique n'est pas garantie. Pour un débit en flux continu maximal, nous vous recommandons de ne pas inclure insertId et d'utiliser plutôt la déduplication manuelle. Pour en savoir plus, consultez la section Assurer la cohérence des données.

Diagnostic

Utilisez les vues STREAMING_TIMELINE_BY_* pour analyser le trafic en flux continu. Ces vues cumulent des statistiques de flux continu sur des intervalles d'une minute, regroupés par code d'erreur. Les erreurs de quota apparaissent dans les résultats, avec la valeur de error_code égale à RATE_LIMIT_EXCEEDED ou QUOTA_EXCEEDED.

En fonction de la limite de quota spécifique qui a été atteinte, consultez total_rows ou total_input_bytes. Si l'erreur est un quota au niveau de la table, filtrez par table_id. Par exemple, la requête suivante affiche le nombre total d'octets ingérés par minute et le nombre total d'erreurs de quota.

SELECT
 start_timestamp,
 error_code,
 SUM(total_input_bytes) as sum_input_bytes,
 SUM(IF(error_code IN ('QUOTA_EXCEEDED', 'RATE_LIMIT_EXCEEDED'),
     total_requests, 0)) AS quota_error
FROM
 `region-us`.INFORMATION_SCHEMA.STREAMING_TIMELINE_BY_PROJECT
WHERE
  start_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY)
GROUP BY
 start_timestamp,
 error_code
ORDER BY 1 DESC

Solution

Si vous utilisez le champ insertId pour la déduplication et que votre projet se trouve dans une région compatible avec le quota d'insertion en flux continu le plus élevé, nous vous recommandons de supprimer le champ insertId. Cette solution peut nécessiter des étapes supplémentaires pour dédupliquer manuellement les données. Pour en savoir plus, consultez la section Supprimer manuellement les doublons.

Si vous n'utilisez pas insertId ou si vous ne pouvez pas le supprimer, surveillez le trafic en flux continu sur une période de 24 heures et analysez les erreurs de quota :

  • Si vous constatez principalement des erreurs RATE_LIMIT_EXCEEDED plutôt que des erreurs QUOTA_EXCEEDED et que votre trafic global est inférieur à 80 % du quota, les erreurs indiquent probablement des pics temporaires. Vous pouvez retenter l'opération en utilisant un intervalle exponentiel entre les tentatives pour gérer ces erreurs.

  • Si vous voyez des erreurs QUOTA_EXCEEDED ou si le trafic global dépasse systématiquement 80 % du quota, envoyez une requête d'augmentation du quota. Pour plus d'informations, consultez la page Demander une limite de quota supérieure.