Automatiser les nouvelles tentatives

Cette page explique comment relancer automatiquement des tâches après tous les échecs ou certains échecs.

Une tâche par lot échoue lorsqu'au moins une de ses tâches échoue, ce qui peut se produire pour diverses raisons. Par défaut, chaque tâche d'une tâche n'est exécutée qu'une seule fois. Si une tâche échoue, elle n'est pas relancée. Cependant, certains problèmes qui entraînent l'échec d'une tâche peuvent être facilement résolus en renouvelant la tâche. Dans ces cas, configurer la tâche pour relancer 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 tâches.

Les nouvelles tentatives automatiques sont adaptées aux tâches faiblement couplées (indépendantes) et peuvent résoudre divers problèmes. Par exemple, les nouvelles tentatives automatiques de tâches peuvent résoudre des problèmes urgents tels que les suivants:

Vous pouvez configurer des 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.
  • Nouvelles tentatives d'exécution des tâches pour tous les échecs: vous pouvez configurer le nombre maximal de tentatives pour relancer automatiquement les tâches ayant échoué. Vous pouvez spécifier entre 0 (par défaut) et 10 tentatives.
  • Relancer des tâches en cas d'échec : vous pouvez configurer différentes actions de tâche en cas d'échecs spécifiques (nouvelle tentative automatique ou échec sans nouvelle tentative). L'action inverse est effectuée pour tous les échecs non spécifiés. Les échecs spécifiques peuvent être identifiés par un code de sortie défini par votre application ou Batch.

Avant de commencer

Réessayer d'exécuter des tâches pour tous les échecs

Vous pouvez définir le nombre maximal de tentatives automatiques (champ maxRetryCount) pour les tâches ayant échoué d'une tâche à l'aide de la gcloud CLI ou de l'API Batch.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration de la tâche et le champ maxRetryCount.

    Par exemple, pour créer une tâche de script de base spécifiant 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'une tâche puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune nouvelle tentative de tâche n'est requise.

  2. Pour créer et exécuter la tâche, 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 de la tâche.

    • LOCATION: lieu de la tâche.

    • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

API

Envoyez une requête POST à la méthode jobs.create qui spécifie le champ maxRetryCount.

Par exemple, pour créer une tâche de script de base spécifiant le nombre maximal de tentatives pour les tâches ayant échoué, exécutez 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 votre projet.

  • LOCATION: lieu de la tâche.

  • JOB_NAME: nom de la tâche.

  • MAX_RETRY_COUNT: nombre maximal de tentatives pour chaque tâche. Pour qu'une tâche puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune nouvelle tentative de tâche n'est requise.

Relancer des tâches pour certains échecs

Vous pouvez définir la manière dont vous souhaitez qu'une tâche gère différents échecs de tâche à l'aide des règles de cycle de vie (champ lifecyclePolicies[]).

Une règle de cycle de vie comprend une action (champ action), une condition d'action (champ actionCondition) et un code de sortie (champ exitCodes[]). L'action spécifiée est exécuté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: relancer les tâches qui échouent avec les codes de sortie spécifiés dans le champ exitCodes[] Les tâches qui échouent avec un code de sortie non spécifié ne sont pas relancées.
  • FAIL_TASK: ne relancez pas les tâches qui échouent avec les codes de sortie spécifiés dans le champ exitCodes[]. Les tâches qui échouent avec un code de sortie non spécifié sont relancées.

En particulier, toutes les tâches qui échouent avec des codes de sortie non spécifiés effectuent l'action inverse : certains codes de sortie sont relancés et d'autres ont échoué. Par conséquent, pour que la stratégie de cycle de vie fonctionne comme prévu, vous devez également définir le nombre maximal de nouvelles tentatives automatiques (champ maxRetryCount) afin de permettre à la tâche de relancer automatiquement au moins une fois les tâches ayant échoué.

Chaque code de sortie représente une défaillance spécifique définie soit par votre application, soit 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 la section Dépannage.

Vous pouvez spécifier qu'une tâche doit relancer ou échouer des tâches après des échecs spécifiques à l'aide de gcloud CLI ou de l'API Batch.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration de la tâche, le champ maxRetryCount et les sous-champs lifecyclePolicies[].

    Pour créer une tâche de script de base qui ne relance les tâches ayant échoué que pour certains codes de sortie, 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,
            "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'une tâche puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune nouvelle tentative de tâche n'est requise.

    • ACTION: action (RETRY_TASK ou FAIL_TASK) de votre choix pour les tâches qui échouent avec les codes de sortie spécifiés. Les tâches qui échouent avec un code de sortie non spécifié effectuent l'autre action.

    • EXIT_CODES: liste d'un ou de plusieurs codes de sortie séparés par une virgule qui doivent déclencher l'action spécifiée (par exemple, 50001, 50002).

      Chaque code de sortie peut être défini par votre application ou 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 la section Dépannage.

    Par exemple, la tâche suivante ne relance que les tâches ayant échoué en raison de la préemption de 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"
            }
          }
        ]
      }
    }
    
  2. Pour créer et exécuter la tâche, 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 de la tâche.

    • LOCATION: lieu de la tâche.

    • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

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 une tâche de script de base qui ne relance les tâches ayant échoué que pour certains codes de sortie, exécutez 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 votre projet.

  • LOCATION: lieu de la tâche.

  • JOB_NAME: nom de la tâche.

  • MAX_RETRY_COUNT: nombre maximal de tentatives pour chaque tâche. Pour qu'une tâche puisse relancer les tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune nouvelle tentative de tâche n'est requise.

  • ACTION: action (RETRY_TASK ou FAIL_TASK) de votre choix pour les tâches qui échouent avec les codes de sortie spécifiés. Les tâches qui échouent avec un code de sortie non spécifié effectuent l'autre action.

  • EXIT_CODES: liste d'un ou de plusieurs codes de sortie séparés par une virgule qui doivent déclencher l'action spécifiée (par exemple, 50001, 50002).

    Chaque code de sortie peut être défini par votre application ou 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 la section Dépannage.

Par exemple, la tâche suivante ne relance que les tâches ayant échoué en raison de la préemption de 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

Après avoir activé les nouvelles tentatives automatiques pour une tâche comme décrit dans les sections précédentes de cette page, vous pouvez éventuellement mettre à jour vos exécutables pour qu'ils utilisent 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é effectué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 est en cours de nouvelle tentative, vous pouvez confirmer 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 la section Variables d'environnement prédéfinies.

Étapes suivantes