En esta página, se describe cómo reintentar automáticamente las tareas después de todo o algunas fallas.
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 un error puede resolverse fácilmente si se vuelve a intentar la tarea. En estos casos, configurar el trabajo para reintentar las tareas automáticamente puede reducir la fricción en la solución de problemas y el tiempo de ejecución general de los trabajos.
Los reintentos automáticos son adecuados para tareas poco acopladas (independientes) y pueden ayudar con una variedad de problemas. Por ejemplo, los reintentos automáticos de tareas puede resolver problemas urgentes, como los siguientes:
- interrupción de las VMs Spot
- Eventos de mantenimiento de VM y errores de host
- errores de red transitorios
Puedes configurar reintentos automáticos de tareas para cada tarea cuando creas un trabajo. Específicamente, para cada tarea, puedes usar uno de los siguientes opciones de configuración:
- De forma predeterminada, no se reintenta cada tarea cuando falla.
- Reintentar las tareas para todas las fallas: Puedes configurar la cantidad máxima de veces para reintentar automáticamente las tareas con errores. Puedes especificar entre 0 (predeterminado) y 10 reintentos.
- Reintentar tareas para algunas fallas: Puedes configurar diversas tareas acciones, ya sea reintento automático o falla sin reintento, por fallas específicas. Se realiza la acción opuesta para todas las fallas no especificadas. Cada una de las fallas específicas se puede identificar con un código de salida definidos por tu aplicación o Batch.
Antes de comenzar
- Si nunca usaste Batch, revisa Comienza a usar Batch y habilitar Batch completando el requisitos previos para los proyectos y usuarios.
-
A fin de obtener los permisos que necesitas para crear un trabajo, solicita a tu administrador que te otorgue el los siguientes roles de IAM:
-
Editor de trabajos por lotes (
roles/batch.jobsEditor
) en el proyecto -
Usuario de la 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 otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
-
Editor de trabajos por lotes (
Cómo reintentar tareas para todas las fallas
Puedes definir
cantidad máxima de reintentos automáticos (campo maxRetryCount
)
para las tareas con errores de un trabajo con gcloud CLI o la API de Batch.
gcloud
Crear un archivo JSON que especifique los detalles de configuración del trabajo y la
maxRetryCount
.Por ejemplo, para crear un trabajo de secuencia de comandos básico que especifique la cantidad máxima reintentos para 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 debe establecerse en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se volverá a intentar ninguna tarea.Para crear y ejecutar la tarea, 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 de la tarea.
API
Realiza una solicitud POST
al
Método jobs.create
que especifique el campo maxRetryCount
.
Por ejemplo, para crear un trabajo de secuencia de comandos básico que especifique la cantidad máxima reintentos para 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
: Es la cantidad máxima. de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor debe establecerse en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se volverá a intentar ninguna tarea.
Reintentar las tareas en caso de algunas fallas
Puedes definir cómo quieres que un trabajo maneje diferentes tareas fallidas mediante
políticas del ciclo de vida (campo lifecyclePolicies[]
).
Una política de ciclo de vida consiste en un
action (campo action
),
condición de acción (campo actionCondition
),
y código de salida (campo exitCodes[]
).
La acción especificada se realiza 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
: Vuelve a intentar las tareas que fallan con los códigos de salida especificados en el campoexitCodes[]
. Las tareas que fallan con códigos de salida no especificados se no se vuelve a intentar.FAIL_TASK
: No reintentes tareas que fallen con los códigos de salida especificados en elexitCodes[]
. Las tareas que fallan con códigos de salida no especificados se se vuelve a intentar.
En particular, cualquier tarea que falla con códigos de salida no especificados toman el
acción opuesta, algunos códigos de salida se reintentan y otros fallan.
Por lo tanto, para que la política del ciclo de vida funcione como se espera,
también debes definir
cantidad máxima de reintentos automáticos (campo maxRetryCount
)
para 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 se define por tu aplicación o 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 un trabajo reintente o rechace las tareas después de fallas específicas con gcloud CLI o la API de Batch.
gcloud
Crear un archivo JSON que especifique los detalles de configuración del trabajo, el
maxRetryCount
y los subcamposlifecyclePolicies[]
.Para crear una tarea de secuencia de comandos básica 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" } }
Reemplaza lo siguiente:
MAX_RETRY_COUNT
: La cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor debe establecerse en un número entero entre1
y10
. Si no se especifica el campomaxRetryCount
, el valor predeterminado es0
, lo que significa que no se volverá a intentar ninguna tarea.ACTION
: Es la acción, ya seaRETRY_TASK
oFAIL_TASK
, que quieres para las tareas que fallan los códigos de salida especificados. Tareas que fallan con una salida no especificada los códigos realizan la otra acción.EXIT_CODES
: Es una lista separada por comas de uno o más códigos de salida con los que deseas activar la acción especificada, por ejemplo,50001, 50002
.Tu aplicación puede definir cada código de salida por lotes. Los códigos de salida de
50001
a59999
están reservadas por Batch. 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 para un 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 tareas fallidas 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
: el ID del proyecto de tu 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 volver a intentar tareas fallidas, 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 no reintentar ninguna tarea.ACTION
: Es la acción, ya seaRETRY_TASK
oFAIL_TASK
, que quieres para las tareas que fallan los códigos de salida especificados. Tareas que fallan con una salida no especificada los códigos realizan la otra acción.EXIT_CODES
: Es una lista separada por comas de uno o más códigos de salida con los que deseas activar la acción especificada, por ejemplo,50001, 50002
.Tu aplicación puede definir cada código de salida por lotes. Los códigos de salida de
50001
a59999
están reservadas por Batch. Para obtener más información sobre los códigos de salida reservados, consulta Soluciona 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"
}
}
]
}
}
Modifica el comportamiento de las tareas según la cantidad de reintentos
De manera opcional, después de habilitar los reintentos automáticos para una tarea
como se describió en las secciones anteriores de esta página, puedes
actualicen sus ejecutables para que usen
Variable de entorno predefinida BATCH_TASK_RETRY_ATTEMPT
.
La variable BATCH_TASK_RETRY_ATTEMPT
describe la cantidad de veces
que esta tarea ya se intentó. Usa el
La variable BATCH_TASK_RETRY_ATTEMPT
en tus ejecutables si quieres
que una tarea se comporte de manera diferente según la cantidad de reintentos.
Por ejemplo, cuando se reintenta una tarea, es posible que desees
confirmar qué comandos ya se ejecutaron correctamente en
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.