Cette page explique comment réessayer automatiquement les tâches après des échecs partiels ou complets.
Une tâche Batch échoue lorsqu'au moins l'une de ses tâches échoue, ce qui peut se produire pour diverses raisons. Par défaut, chaque tâche d'un job n'est exécutée qu'une seule fois. Si une tâche échoue, elle n'est pas relancée. Toutefois, certains problèmes qui entraînent l'échec d'une tâche peuvent être facilement résolus en réessayant la tâche. Dans ce cas, configurer le job pour qu'il relance automatiquement les tâches peut considérablement réduire les difficultés de dépannage et la durée d'exécution globale de vos jobs.
Les nouvelles tentatives automatiques sont bien adaptées aux tâches faiblement couplées (indépendantes) et peuvent aider à résoudre divers problèmes. Par exemple, les nouvelles tentatives automatiques peuvent résoudre les problèmes urgents suivants :
- Préemption des VM Spot
- Événements de maintenance des VM et erreurs d'hôte
- erreurs réseau temporaires
Vous pouvez configurer des nouvelles tentatives automatiques pour chaque tâche lorsque vous créez un job. Plus précisément, pour chaque tâche, vous pouvez utiliser l'une des options de configuration suivantes :
- Par défaut, chaque tâche n'est pas relancée en cas d'échec.
- Nouvelle tentative pour tous les échecs : vous pouvez configurer le nombre maximal de nouvelles tentatives automatiques en cas d'échec des tâches. Vous pouvez spécifier entre 0 (valeur par défaut) et 10 nouvelles tentatives.
- Nouvelle tentative pour certaines tâches en cas d'échec : vous pouvez configurer différentes actions de tâche (nouvelle tentative automatique ou échec sans nouvelle tentative) pour des échecs spécifiques. L'action inverse est effectuée pour tous les échecs non spécifiés. Chaque échec spécifique peut être identifié par un code de sortie défini par votre application ou par Batch.
Avant de commencer
- Si vous n'avez jamais utilisé Batch, consultez Premiers pas avec Batch et activez Batch en remplissant les conditions préalables pour les projets et les utilisateurs.
-
Pour obtenir les autorisations nécessaires pour créer un job, demandez à votre administrateur de vous accorder les rôles IAM suivants :
-
Éditeur de tâches par lot (
roles/batch.jobsEditor
) sur le projet -
Utilisateur du compte de service (
roles/iam.serviceAccountUser
) sur le compte de service du job, qui par défaut est le compte de service Compute Engine par défaut
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
-
Éditeur de tâches par lot (
Réessayer les tâches en cas d'échec
Vous pouvez définir le nombre maximal de nouvelles tentatives automatiques (champ maxRetryCount
) pour les tâches ayant échoué d'un job à l'aide de gcloud CLI ou de l'API Batch.
gcloud
Créez un fichier JSON qui spécifie les détails de la configuration du job et le champ
maxRetryCount
.Par exemple, pour créer un job de script de base qui spécifie le nombre maximal de tentatives pour les tâches ayant échoué, créez un fichier JSON avec le contenu suivant :
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT }, "taskCount": 3 } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Remplacez
MAX_RETRY_COUNT
par le nombre maximal de tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un nombre entier compris entre1
et10
. Si le champmaxRetryCount
n'est pas spécifié, la valeur par défaut est0
, ce qui signifie qu'aucune tâche ne doit être relancée.Pour créer et exécuter le job, utilisez la commande
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Remplacez les éléments suivants :
JOB_NAME
: nom du job.LOCATION
: emplacement du job.JSON_CONFIGURATION_FILE
: chemin d'accès à un fichier JSON contenant les détails de configuration du job.
API
Envoyez une requête POST
à la méthode jobs.create
qui spécifie le champ maxRetryCount
.
Par exemple, pour créer un job de script de base qui spécifie le nombre maximal de tentatives pour les tâches ayant échoué, envoyez la requête suivante :
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"
}
}
Remplacez les éléments suivants :
PROJECT_ID
: ID de projet de votre projet.LOCATION
: emplacement du job.JOB_NAME
: nom du job.MAX_RETRY_COUNT
: nombre maximal de tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un nombre entier compris entre1
et10
. Si le champmaxRetryCount
n'est pas spécifié, la valeur par défaut est0
, ce qui signifie qu'aucune tâche ne doit être relancée.
Réessayer les tâches en cas d'échec
Vous pouvez définir la façon dont un job doit gérer les différents échecs de tâches à l'aide des règles de cycle de vie (champ lifecyclePolicies[]
).
Une règle de cycle de vie se compose d'une action (champ action
), d'une condition d'action (champ actionCondition
) et d'un code de sortie (champ exitCodes[]
).
L'action spécifiée est effectuée chaque fois que la condition d'action (un code de sortie spécifique) se produit.
Vous pouvez spécifier l'une des actions suivantes :
RETRY_TASK
: nouvelle tentative pour les tâches qui échouent avec les codes de sortie spécifiés dans le champexitCodes[]
. Les tâches qui échouent avec des codes de sortie non spécifiés ne font pas l'objet de nouvelles tentatives.FAIL_TASK
: ne pas réessayer les tâches qui échouent avec les codes de sortie spécifiés dans le champexitCodes[]
. Les tâches qui échouent avec des codes de sortie non spécifiés sont relancées.
En particulier, toutes les tâches qui échouent avec des codes de sortie non spécifiés effectuent l'action inverse : certaines sont relancées et d'autres échouent.
Par conséquent, pour que la règle de cycle de vie fonctionne comme prévu, vous devez également définir le nombre maximal de nouvelles tentatives automatiques (champ maxRetryCount
) pour permettre au job de relancer automatiquement les tâches ayant échoué au moins une fois.
Chaque code de sortie représente un échec spécifique défini par votre application ou par Batch. Les codes de sortie de 50001 à 59999 sont réservés et définis par Batch. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage.
Vous pouvez spécifier qu'un job doit réessayer ou échouer des tâches après des échecs spécifiques à l'aide de gcloud CLI ou de l'API Batch.
gcloud
Créez un fichier JSON qui spécifie les détails de configuration du job, le champ
maxRetryCount
et les sous-champslifecyclePolicies[]
.Pour créer un job de script de base qui relance les tâches ayant échoué uniquement pour certains codes de sortie, créez un fichier JSON contenant les éléments suivants :
{ "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" } }
Remplacez les éléments suivants :
MAX_RETRY_COUNT
: nombre maximal de tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un nombre entier compris entre1
et10
. Si le champmaxRetryCount
n'est pas spécifié, la valeur par défaut est0
, ce qui signifie qu'aucune tâche ne doit être relancée.ACTION
: action (RETRY_TASK
ouFAIL_TASK
) que vous souhaitez appliquer aux tâches qui échouent avec les codes de sortie spécifiés. Les tâches qui échouent avec des codes de sortie non spécifiés effectuent l'autre action.EXIT_CODES
: liste d'un ou de plusieurs codes de sortie séparés par une virgule que vous souhaitez déclencher pour l'action spécifiée (par exemple,50001, 50002
).Chaque code de sortie peut être défini par votre application ou par Batch. Les codes de sortie de
50001
à59999
sont réservés par Batch. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage.
Par exemple, le job suivant ne relance que les tâches qui échouent en raison de la préemption des VM 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" } } ] } }
Pour créer et exécuter le job, utilisez la commande
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Remplacez les éléments suivants :
JOB_NAME
: nom du job.LOCATION
: emplacement du job.JSON_CONFIGURATION_FILE
: chemin d'accès à un fichier JSON contenant les détails de configuration du job.
API
Envoyez une requête POST
à la méthode jobs.create
qui spécifie le champ maxRetryCount
et les sous-champs lifecyclePolicies[]
.
Pour créer un job de script de base qui relance les tâches ayant échoué uniquement pour certains codes de sortie, envoyez la requête suivante :
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"
}
}
Remplacez les éléments suivants :
PROJECT_ID
: ID de projet de votre projet.LOCATION
: emplacement du job.JOB_NAME
: nom du job.MAX_RETRY_COUNT
: nombre maximal de tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un nombre entier compris entre1
et10
. Si le champmaxRetryCount
n'est pas spécifié, la valeur par défaut est0
, ce qui signifie qu'aucune tâche ne doit être relancée.ACTION
: action (RETRY_TASK
ouFAIL_TASK
) que vous souhaitez appliquer aux tâches qui échouent avec les codes de sortie spécifiés. Les tâches qui échouent avec des codes de sortie non spécifiés effectuent l'autre action.EXIT_CODES
: liste d'un ou de plusieurs codes de sortie séparés par une virgule que vous souhaitez déclencher pour l'action spécifiée (par exemple,50001, 50002
).Chaque code de sortie peut être défini par votre application ou par Batch. Les codes de sortie de
50001
à59999
sont réservés par Batch. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage.
Par exemple, le job suivant ne relance que les tâches qui échouent en raison de la préemption des VM 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"
}
}
]
}
}
Modifier le comportement des tâches en fonction du nombre de tentatives
Si vous le souhaitez, une fois que vous avez activé les nouvelles tentatives automatiques pour une tâche, comme décrit dans les sections précédentes de cette page, vous pouvez mettre à jour vos exécutables pour utiliser la variable d'environnement prédéfinie BATCH_TASK_RETRY_ATTEMPT
.
La variable BATCH_TASK_RETRY_ATTEMPT
décrit le nombre de fois où cette tâche a déjà été tentée. Utilisez la variable BATCH_TASK_RETRY_ATTEMPT
dans vos exécutables si vous souhaitez qu'une tâche se comporte différemment en fonction du nombre de tentatives.
Par exemple, lorsqu'une tâche fait l'objet d'une nouvelle tentative, vous pouvez vérifier les commandes qui ont déjà été exécutées avec succès lors de la tentative précédente. Pour en savoir plus, consultez Variables d'environnement prédéfinies.
Étapes suivantes
- Si vous rencontrez des problèmes pour créer ou exécuter un job, consultez la section Dépannage.
- Afficher les jobs et les tâches
- Découvrez d'autres options de création de tâches.