En esta página se describe cómo volver a intentar ejecutar tareas automáticamente después de que se hayan producido todos los errores o algunos de ellos.
Un trabajo por lotes falla cuando al menos una de sus tareas falla, lo que puede ocurrir por varios motivos. De forma predeterminada, cada tarea de un trabajo solo se ejecuta una vez. Si una tarea falla, no se vuelve a intentar. Sin embargo, algunos problemas que provocan que una tarea falle se pueden resolver fácilmente volviendo a intentarlo. En estos casos, configurar el trabajo para que vuelva a intentar las tareas automáticamente puede ayudar considerablemente a reducir los problemas y el tiempo de ejecución general de los trabajos.
Los reintentos automáticos son adecuados para tareas con un bajo acoplamiento (independientes) y pueden ayudar a solucionar diversos problemas. Por ejemplo, los reintentos automáticos de tareas pueden resolver problemas urgentes como los siguientes:
- Interrupción de máquinas virtuales de acceso puntual
- Eventos de mantenimiento de máquinas virtuales y errores de host
- errores de red transitorios
Puedes configurar reintentos automáticos de tareas para cada tarea al crear un trabajo. En concreto, para cada tarea, puedes usar una de las siguientes opciones de configuración:
- De forma predeterminada, cada tarea no se vuelve a intentar cuando falla.
- Reintentar tareas en caso de error: puedes configurar el número máximo de veces que se reintentarán automáticamente las tareas fallidas. Puedes especificar entre 0 (valor predeterminado) y 10 reintentos.
- Volver a intentar tareas en caso de algunos errores: puedes configurar diferentes acciones de tareas (volver a intentar automáticamente o fallar sin volver a intentar) para errores específicos. Se lleva a cabo la acción opuesta en todos los errores no especificados. Cada fallo específico se puede identificar mediante un código de salida definido por tu aplicación o por Batch.
Antes de empezar
- Si no has usado Batch antes, consulta el artículo Empezar a usar Batch y habilita Batch completando los requisitos previos para proyectos y usuarios.
-
Para obtener los permisos que necesitas para crear un trabajo, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:
-
Editor de trabajos por lotes (
roles/batch.jobsEditor
) en el proyecto -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) en la cuenta de servicio del trabajo, que de forma predeterminada es la cuenta de servicio predeterminada de Compute Engine
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
-
Editor de trabajos por lotes (
Reintentar tareas en caso de error
Puedes definir el número máximo de reintentos automáticos (campo maxRetryCount
) de las tareas fallidas de un trabajo mediante la CLI de gcloud o la API Batch.
gcloud
Crea un archivo JSON que especifique los detalles de configuración del trabajo y el campo
maxRetryCount
.Por ejemplo, para crear un trabajo de script básico que especifique el número máximo de reintentos de las tareas fallidas, crea un archivo JSON con el siguiente contenido:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT }, "taskCount": 3 } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Sustituye
MAX_RETRY_COUNT
por el número máximo de reintentos de cada tarea. Para que un trabajo pueda volver a intentar las tareas fallidas, este valor debe ser un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se reintentará ninguna tarea.Para crear y ejecutar el trabajo, usa el comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Haz los cambios siguientes:
JOB_NAME
: el nombre del puesto.LOCATION
: la ubicación del puesto.JSON_CONFIGURATION_FILE
: la ruta de un archivo JSON con los detalles de configuración del trabajo.
API
Envía una solicitud POST
al
método jobs.create
que especifique el campo maxRetryCount
.
Por ejemplo, para crear un trabajo de script básico que especifique el número máximo de reintentos de las tareas fallidas, haz la siguiente solicitud:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
Haz los cambios siguientes:
PROJECT_ID
: el ID de proyecto de tu proyecto.LOCATION
: la ubicación del puesto.JOB_NAME
: el nombre del puesto.MAX_RETRY_COUNT
: número máximo de reintentos de cada tarea. Para que un trabajo pueda volver a intentar las tareas fallidas, este valor debe ser un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se reintentará ninguna tarea.
Reintentar tareas en caso de algunos errores
Puedes definir cómo quieres que un trabajo gestione los diferentes errores de tareas mediante las políticas de ciclo de vida (campo lifecyclePolicies[]
).
Una política de ciclo de vida consta de una acción (campo action
), una condición de acción (campo actionCondition
) y un código de salida (campo exitCodes[]
).
La acción especificada se lleva a cabo siempre que se produce la condición de la acción, que es un código de salida específico.
Puedes especificar una de las siguientes acciones:
RETRY_TASK
: vuelve a intentar las tareas que fallen con los códigos de salida especificados en el campoexitCodes[]
. Las tareas que fallan con códigos de salida no especificados no se vuelven a intentar.FAIL_TASK
: no vuelvas a intentar realizar las tareas que fallen con los códigos de salida especificados en el campoexitCodes[]
. Las tareas que fallan con códigos de salida no especificados se vuelven a intentar.
En concreto, las tareas que fallan con códigos de salida no especificados realizan la acción opuesta: se vuelve a intentar ejecutar algunos códigos de salida y otros fallan.
Por lo tanto, para que la política de ciclo de vida funcione correctamente, también debes definir el número máximo de reintentos automáticos (campo maxRetryCount
) para permitir que el trabajo vuelva a intentar automáticamente las tareas fallidas al menos una vez.
Cada código de salida representa un error específico definido por tu aplicación o por Batch. Los códigos de salida del 50001 al 59999 están reservados y definidos por Batch. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas.
Puedes especificar que una tarea se vuelva a intentar o falle después de errores concretos mediante la CLI de gcloud o la API Batch.
gcloud
Crea un archivo JSON que especifique los detalles de configuración del trabajo, el campo
maxRetryCount
y los subcamposlifecyclePolicies[]
.Para crear un trabajo de secuencia de comandos básico que vuelva a intentar las tareas fallidas solo para algunos códigos de salida, crea un archivo JSON con el siguiente contenido:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT, "lifecyclePolicies": [ { "action": "ACTION", "actionCondition": { "exitCodes": [EXIT_CODES] } } ] } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Haz los cambios siguientes:
MAX_RETRY_COUNT
: número máximo de reintentos de cada tarea. Para que un trabajo pueda volver a intentar las tareas fallidas, este valor debe ser un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se reintentará ninguna tarea.ACTION
: la acción,RETRY_TASK
oFAIL_TASK
, que quieras que se lleve a cabo en las tareas que fallen con los códigos de salida especificados. Las tareas que fallan con códigos de salida no especificados realizan la otra acción.EXIT_CODES
: lista separada por comas de uno o varios códigos de salida que quieres que activen la acción especificada (por ejemplo,50001, 50002
).Tu aplicación o Batch pueden definir cada código de salida. Los códigos de salida de
50001
a59999
están reservados para Batch. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas.
Por ejemplo, la siguiente tarea solo vuelve a intentar las tareas que fallan debido a la expropiación de las VMs de acceso puntual.
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "sleep 30" } } ], "maxRetryCount": 3, "lifecyclePolicies": [ { "action": "RETRY_TASK", "actionCondition": { "exitCodes": [50001] } } ] } } ], "allocationPolicy": { "instances": [ { "policy": { "machineType": "e2-standard-4", "provisioningModel": "SPOT" } } ] } }
Para crear y ejecutar el trabajo, usa el comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Haz los cambios siguientes:
JOB_NAME
: el nombre del puesto.LOCATION
: la ubicación del puesto.JSON_CONFIGURATION_FILE
: la ruta de un archivo JSON con los detalles de configuración del trabajo.
API
Envía una solicitud POST
al
método jobs.create
que especifique el campo maxRetryCount
y los subcampos lifecyclePolicies[]
.
Para crear un trabajo de secuencia de comandos básico que vuelva a intentar las tareas fallidas solo para algunos códigos de salida, haz la siguiente solicitud:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT,
"lifecyclePolicies": [
{
"action": "ACTION",
"actionCondition": {
"exitCodes": [EXIT_CODES]
}
}
]
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
Haz los cambios siguientes:
PROJECT_ID
: el ID de proyecto de tu proyecto.LOCATION
: la ubicación del puesto.JOB_NAME
: el nombre del puesto.MAX_RETRY_COUNT
: número máximo de reintentos de cada tarea. Para que un trabajo pueda volver a intentar las tareas fallidas, este valor debe ser un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se reintentará ninguna tarea.ACTION
: la acción,RETRY_TASK
oFAIL_TASK
, que quieras que se lleve a cabo en las tareas que fallen con los códigos de salida especificados. Las tareas que fallan con códigos de salida no especificados realizan la otra acción.EXIT_CODES
: lista separada por comas de uno o varios códigos de salida que quieres que activen la acción especificada (por ejemplo,50001, 50002
).Tu aplicación o Batch pueden definir cada código de salida. Los códigos de salida de
50001
a59999
están reservados para Batch. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas.
Por ejemplo, la siguiente tarea solo vuelve a intentar las tareas que fallan debido a la expropiación de las VMs de acceso puntual.
POST https://batch.googleapis.com/v1/projects/example-project/locations/us-central1/jobs?job_id=example-job
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 30"
}
}
],
"maxRetryCount": 3,
"lifecyclePolicies": [
{
"action": "RETRY_TASK",
"actionCondition": {
"exitCodes": [50001]
}
}
]
}
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"machineType": "e2-standard-4",
"provisioningModel": "SPOT"
}
}
]
}
}
Modificar el comportamiento de las tareas en función del número de reintentos
Si quieres, después de habilitar los reintentos automáticos de una tarea, como se describe en las secciones anteriores de esta página, puedes actualizar tus elementos ejecutables para que usen la variable de entorno predefinida BATCH_TASK_RETRY_ATTEMPT
.
La variable BATCH_TASK_RETRY_ATTEMPT
describe el número de veces que ya se ha intentado realizar esta tarea. Usa la variable BATCH_TASK_RETRY_ATTEMPT
en tus elementos ejecutables si quieres que una tarea se comporte de forma diferente en función del número de reintentos.
Por ejemplo, cuando se vuelve a intentar realizar una tarea, puede que quieras confirmar qué comandos se han ejecutado correctamente en el intento anterior. Para obtener más información, consulta Variables de entorno predefinidas.
Siguientes pasos
- Si tienes problemas para crear o ejecutar un trabajo, consulta la sección Solución de problemas.
- Ver trabajos y tareas.
- Consulta más información sobre las opciones de creación de trabajos.