Solucionar errores de cuota de BigQuery

BigQuery tiene varias cuotas que limitan la frecuencia y el volumen de las solicitudes entrantes. Estas cuotas se utilizan para proteger los sistemas de backend y prevenir gastos inesperados si envías tareas muy grandes. En este documento se explica cómo diagnosticar y mitigar los errores derivados de las cuotas.

Información general

Si una operación de BigQuery falla a causa de un límite de cuota, la API devuelve el código de estado HTTP 403 Forbidden. El cuerpo de la respuesta incluye más información sobre el límite que se ha alcanzado y tiene un aspecto similar a este:

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

El campo message de la carga útil indica cuál es el límite que se ha superado. Por ejemplo, la información del campo message podría ser: Exceeded rate limits: too many table update operations for this table.

Por lo general, los límites de cuota se dividen en dos categorías. La categoría correspondiente se indica en el campo reason de la carga útil de la respuesta.

  • rateLimitExceeded: este valor indica un límite a corto plazo. Si superas el límite, lo habitual es que el problema se solucione si vuelves a intentar la operación al cabo de unos segundos, dejando un tiempo de espera exponencial entre cada intento. Esto quiere decir que debes aumentar exponencialmente el tiempo que transcurre entre cada intento.

  • quotaExceeded: este valor indica un límite a largo plazo. Si llegas a un límite de este tipo, tendrás que esperar 10 minutos como mínimo antes de volver a realizar la operación. Si lo alcanzas sistemáticamente, te recomendamos que analices tu carga de trabajo para determinar cómo puedes mitigar el problema. Entre otras medidas, puedes optimizar tu carga de trabajo o solicitar un aumento de cuota.

En caso de que recibas un error quotaExceeded, revisa el mensaje para saber qué límite de cuota se ha superado. Luego, analiza tu carga de trabajo y comprueba si puedes tomar alguna medida para no llegar a la cuota como, por ejemplo, optimizar el rendimiento de las consultas. En algunos casos, la cuota se puede aumentar. Para hacerlo, ponte en contacto con el equipo de Asistencia de BigQuery o con el equipo de Ventas de Google Cloud.

Puedes usar las vistas de INFORMATION_SCHEMA para analizar el problema subyacente. Se trata de un conjunto de vistas que contienen metadatos sobre tus recursos de BigQuery, incluidas las tareas, las reservas y las inserciones de transmisión. Por ejemplo, en la siguiente consulta, se usa la vista JOBS_BY_PROJECT, en la que se enumeran todos los errores relacionados con la cuota que se han producido en el último día.

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')

También puedes consultar errores en los registros de auditoría de Cloud. Por ejemplo, mediante el visualizador de registros, se puede ver que la siguiente consulta detecta errores con el valor Quota exceeded en la cadena del mensaje:

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

El código de estado 7 indica PERMISSION_DENIED, que se corresponde con el código de estado HTTP 403.

Errores de cuota de inserción de transmisión

En esta sección se proporcionan consejos para solucionar errores de cuota asociados a la transmisión de datos a BigQuery.

En determinadas regiones, las inserciones de transmisión tienen una cuota más alta si no rellenas el campo insertId de cada fila. Puedes consultar más información sobre las cuotas de las inserciones de transmisión aquí. Los errores relacionados con la cuota de transmisión de BigQuery están determinados por la presencia o ausencia de insertId.

Si el campo insertId está vacío, es posible que se produzca el siguiente error de cuota:

Límite de cuota Mensaje de error
Bytes por segundo y proyecto La entidad con gaia_id GAIA_ID del proyecto PROJECT_ID en la región REGION ha superado la cuota de inserción de bytes por segundo.

Si se rellena el campo insertId, pueden producirse los siguientes errores de cuota:

Límite de cuota Mensaje de error
Filas por segundo y proyecto El proyecto PROJECT_ID en la región REGION ha superado la cuota de inserción de transmisión de filas por segundo.
Filas por segundo y tabla La tabla TABLE_ID ha superado la cuota de inserción de transmisión de filas por segundo.
Bytes por segundo y tabla La tabla TABLE_ID ha superado la cuota de inserción de transmisión de bytes por segundo.

La función del campo insertId es anular los duplicados de filas insertadas. Si llegan varias inserciones con el mismo insertId en un periodo de pocos minutos, BigQuery escribe una sola versión del registro. Sin embargo, esta anulación automática de duplicados no está garantizada. Si quieres conseguir el máximo rendimiento de transmisión, te recomendamos que, en lugar de incluir insertId, anules los duplicados manualmente. Para obtener más información, consulta cómo asegurar la coherencia de los datos.

Diagnóstico

Usa las vistas STREAMING_TIMELINE_BY_* para analizar el tráfico de transmisión. En estas vistas, se engloban las estadísticas de transmisión en intervalos de un minuto, agrupadas por código de error. Los errores de cuota aparecen en los resultados en los que error_code es igual a RATE_LIMIT_EXCEEDED o a QUOTA_EXCEEDED.

Según el límite de cuota específico que se haya alcanzado, observa total_rows o total_input_bytes. Si el error se ha producido en una cuota a nivel de tabla, filtra por table_id. Por ejemplo, en la siguiente consulta se muestra el total de bytes ingeridos por minuto y la cantidad total de errores de cuota.

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

Solución

Si usas el campo insertId para que se anulen los duplicados y el proyecto está en una región que admite una cuota de transmisión más alta, es recomendable que quites el campo insertId. Esta solución puede requerir algunos pasos adicionales para anular de forma manual los duplicados de datos. Para obtener más información, consulta cómo quitar duplicados manualmente.

Si no usas el campo insertId o no es factible quitarlo, monitoriza el tráfico de transmisión durante 24 horas y analiza los errores de cuota:

  • Si observas que, principalmente, se producen errores RATE_LIMIT_EXCEEDED en lugar de QUOTA_EXCEEDED y el tráfico general es inferior al 80 % de la cuota, es probable que los errores se deban a que se han producido picos temporales. Para solucionarlos, vuelve a intentar la operación dejando un tiempo de espera exponencial entre cada intento.

  • Si se producen errores QUOTA_EXCEEDED o el tráfico general supera el 80 % de la cuota, envía una solicitud para aumentarla.