En esta página, se describe cómo reintentar las tareas de forma automática después de todas o algunas fallas.
Un trabajo por lotes falla cuando al menos una de sus tareas falla, lo que puede suceder por varias razones. De forma predeterminada, cada tarea de un trabajo solo se ejecuta una vez; si una tarea falla, no se reintenta. Sin embargo, algunos problemas que hacen que una tarea falle se pueden resolver con facilidad con solo reintentar la tarea. En estos casos, configurar el trabajo para que reintente automáticamente las tareas puede ayudar de forma significativa a reducir la fricción de la solución de problemas y el tiempo de ejecución general de los trabajos.
Los reintentos automáticos son adecuados para las tareas con acoplamiento bajo (independientes) y pueden ayudar con una variedad de problemas. Por ejemplo, los reintentos automáticos de tareas pueden resolver problemas urgentes, como los siguientes:
- interrupción de VMs Spot
- Eventos de mantenimiento de VM y errores de host
- errores transitorios de red
Puedes configurar reintentos automáticos de tareas para cada tarea cuando creas un trabajo. Específicamente, para cada tarea, puedes usar una de las siguientes opciones de configuración:
- De forma predeterminada, no se reintenta cada tarea cuando falla.
- Reintentar las tareas para todas las fallas: Puedes configurar los tiempos máximos para reintentar automáticamente las tareas con errores. Puedes especificar entre 0 (configuración predeterminada) y 10 reintentos.
- Reintentar las tareas para algunas fallas: Puedes configurar diferentes acciones de tarea, ya sea reintento automático o falla sin reintento, para fallas específicas. Se realiza la acción opuesta para todas las fallas no especificadas. Las fallas específicas se pueden identificar mediante un código de salida definido por tu aplicación o Batch.
Antes de comenzar
- Si no has usado Batch antes, revisa Comienza a usar Batch y completa los requisitos previos para los proyectos y usuarios a fin de habilitar Batch.
-
Si quieres obtener los permisos que necesitas para crear un trabajo, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
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
Si quieres obtener más información para otorgar roles, consulta Administra el acceso.
Es posible que también puedas obtener los permisos necesarios a través de los roles personalizados o de otros roles predefinidos.
-
Editor de trabajos por lotes (
Reintentar las tareas para todas las fallas
Puedes definir la cantidad máxima de reintentos automáticos (campo maxRetryCount
) para las tareas con errores de un trabajo mediante gcloud CLI o la API de 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 básico de secuencia de comandos que especifique la cantidad máxima de reintentos para las tareas con errores, 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" } }
Reemplaza
MAX_RETRY_COUNT
por la cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se debe 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
Reemplaza lo siguiente:
JOB_NAME
: Es el nombre del trabajo.LOCATION
: Es la ubicación del trabajo.JSON_CONFIGURATION_FILE
: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.
API
Realiza una solicitud POST
al método jobs.create
que especifica el campo maxRetryCount
.
Por ejemplo, para crear un trabajo básico de secuencia de comandos que especifique la cantidad máxima de reintentos para las tareas con errores, realiza 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"
}
}
Reemplaza lo siguiente:
PROJECT_ID
: Es el ID del proyecto.LOCATION
: Es la ubicación del trabajo.JOB_NAME
: Es el nombre del trabajo.MAX_RETRY_COUNT
: La cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se debe reintentar ninguna tarea.
Reintentar tareas para algunas fallas
Puedes definir cómo deseas que un trabajo maneje diferentes fallas en las tareas con 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[]
).
Se realiza la acción especificada cada vez que se produce la condición de acción (un código de salida específico).
Puedes especificar una de las siguientes acciones:
RETRY_TASK
: Reintenta las tareas que fallan con los códigos de salida especificados en el campoexitCodes[]
. No se reintentan las tareas que fallan con códigos de salida no especificados.FAIL_TASK
: No vuelvas a intentar las tareas que fallan con los códigos de salida especificados en el campoexitCodes[]
. Se reintentan las tareas que fallan con cualquier código de salida no especificado.
En particular, cualquier tarea que falle con códigos de salida no especificados toma la acción opuesta: algunos códigos de salida se reintentan y otros fallan.
En consecuencia, para que la política de ciclo de vida funcione como se espera, también debes definir la cantidad máxima de reintentos automáticos (campo maxRetryCount
) a fin de permitir que el trabajo reintente automáticamente las tareas con errores al menos una vez.
Cada código de salida representa una falla específica que define tu aplicación o Batch. Los códigos de salida de 50001 a 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 un trabajo reintente o falle tareas después de fallas específicas mediante gcloud CLI o la API de 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 reintente las tareas con errores 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" } }
Reemplaza lo siguiente:
MAX_RETRY_COUNT
: Es la cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se debe reintentar ninguna tarea.ACTION
: Es la acción, ya seaRETRY_TASK
oFAIL_TASK
, que deseas para las tareas que fallan 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
: Es una lista separada por comas de uno o más códigos de salida que deseas que activen la acción especificada, por ejemplo,50001, 50002
.Cada código de salida se puede definir mediante tu aplicación o Batch. Batch reserva los códigos de salida de
50001
a59999
. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas.
Por ejemplo, el siguiente trabajo solo reintenta las tareas que fallan debido a la interrupción de las VMs Spot.
{ "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
Reemplaza lo siguiente:
JOB_NAME
: Es el nombre del trabajo.LOCATION
: Es la ubicación del trabajo.JSON_CONFIGURATION_FILE
: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.
API
Realiza 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 reintente las tareas con errores solo para algunos códigos de salida, realiza 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"
}
}
Reemplaza lo siguiente:
PROJECT_ID
: Es el ID del proyecto.LOCATION
: Es la ubicación del trabajo.JOB_NAME
: Es el nombre del trabajo.MAX_RETRY_COUNT
: Es la cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se debe reintentar ninguna tarea.ACTION
: Es la acción, ya seaRETRY_TASK
oFAIL_TASK
, que deseas para las tareas que fallan 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
: Es una lista separada por comas de uno o más códigos de salida que deseas que activen la acción especificada, por ejemplo,50001, 50002
.Cada código de salida se puede definir mediante tu aplicación o Batch. Batch reserva los códigos de salida de
50001
a59999
. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas.
Por ejemplo, el siguiente trabajo solo reintenta las tareas que fallan debido a la interrupción de las VMs Spot.
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 la tarea según la cantidad de reintentos
De manera opcional, después de habilitar los reintentos automáticos para una tarea como se describe en las secciones anteriores de esta página, puedes actualizar los ejecutables para que usen la variable de entorno predefinida BATCH_TASK_RETRY_ATTEMPT
.
La variable BATCH_TASK_RETRY_ATTEMPT
describe la cantidad de veces que se intentó realizar esta tarea. Usa la variable BATCH_TASK_RETRY_ATTEMPT
en tus ejecutables si deseas que una tarea se comporte de manera diferente según la cantidad de reintentos.
Por ejemplo, cuando se vuelve a intentar una tarea, es posible que desees confirmar qué comandos ya se ejecutaron con éxito en el intento anterior. Para obtener más información, consulta Variables de entorno predefinidas.
¿Qué sigue?
- Si tienes problemas para crear o ejecutar un trabajo, consulta Solución de problemas.
- Visualiza trabajos y tareas.
- Obtén más información sobre las opciones de creación de trabajos.