Automatiser les nouvelles tentatives d'exécution de tâches

Cette page explique comment relancer automatiquement des tâches après ou des défaillances.

Un job par lot échoue lorsqu'au moins une de ses tâches échoue, ce qui peut se produisent pour diverses raisons. Par défaut, chaque tâche d'un job ne s'exécute qu'une seule fois. si une tâche échoue, elle n'est pas relancée. Cependant, certains problèmes amenant une tâche à échouer peut être facilement résolu simplement en renouvelant la tâche. Dans ces cas, configurer le job de façon à relancer automatiquement les tâches peut considérablement réduire la difficulté à résoudre les problèmes et la durée d'exécution globale de vos jobs.

Les nouvelles tentatives automatiques sont adaptées tâches faiblement couplées (indépendantes) ; et peut vous aider à résoudre différents problèmes. Par exemple, de nouvelles tentatives automatiques de tâches peut résoudre les 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 méthodes suivantes : de configuration:

  • Par défaut, chaque tâche n'est pas relancée en cas d'échec.
  • Relancer les tâches pour tous les échecs: vous pouvez configurer le nombre maximal de tentatives automatiques des tâches ayant échoué. Toi vous pouvez spécifier entre 0 (valeur par défaut) et 10 tentatives.
  • Relancer des tâches en cas d'échec: Vous pouvez configurer différentes tâches (nouvelle tentative automatique ou échec sans nouvelle tentative) par des défaillances spécifiques. L'action inverse est appliquée pour toutes les défaillances non spécifiées. Les échecs spécifiques peuvent être identifiés par un code de sortie défini par votre application ou Batch.

Avant de commencer

Relancer les tâches pour tous les échecs

Vous pouvez définir nombre maximal de tentatives automatiques (champ maxRetryCount) pour les tâches ayant échoué à 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 du job et la classe maxRetryCount.

    Par exemple, pour créer un job de script de base qui spécifie le nombre maximal de nouvelles 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"
      }
    }
    

    Remplacer MAX_RETRY_COUNT par le nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être 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 de ne pas relancer de tâches.

  2. 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 de la tâche.

    • LOCATION: emplacement du travail.

    • JSON_CONFIGURATION_FILE: chemin d'accès d'un fichier JSON contenant les détails de configuration du job.

API

Envoyez une requête POST à Méthode jobs.create spécifiant le champ maxRetryCount.

Par exemple, pour créer un job de script de base qui spécifie le nombre maximal 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: le ID du projet de votre projet.

  • LOCATION: emplacement du travail.

  • JOB_NAME: nom de la tâche.

  • MAX_RETRY_COUNT: nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être 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 de ne pas relancer de tâches.

Relancer des tâches en cas d'échec

Vous pouvez définir la manière dont une tâche doit gérer différentes échecs de tâches en utilisant Règles relatives au cycle de vie (champ lifecyclePolicies[]).

Une stratégie de cycle de vie se compose action (champ action), condition d'action (champ actionCondition), et le code de sortie (champ exitCodes[]). L'action spécifiée est exécutée chaque fois que une condition d'action (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 paramètre exitCodes[]. Les tâches qui échouent avec un code de sortie non spécifié sont pas de nouvelle tentative.
  • FAIL_TASK: ne relancez pas les tâches qui échouent avec les codes de sortie spécifiés dans le paramètre exitCodes[]. Les tâches qui échouent avec un code de sortie non spécifié sont nouvelle tentative.

En particulier, toutes les tâches qui échouent avec des codes de sortie non spécifiés prennent le action opposée : certains codes de sortie font l'objet de nouvelles tentatives, tandis que d'autres échouent. Par conséquent, pour que la stratégie de cycle de vie fonctionne comme prévu, vous devez également définir nombre maximal de 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 Batch. Les codes de sortie de 50001 à 59999 sont réservés et définis par par lot. 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 faire échouer les 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 du job, le 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 et quelques 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 nouvelles tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être 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 de ne pas relancer de tâches.

    • ACTION: action, soit RETRY_TASK ou FAIL_TASK, que vous souhaitez pour les tâches qui échouent les codes de sortie spécifiés. Tâches qui échouent avec une sortie non spécifiée les codes effectuent l'autre action.

    • EXIT_CODES: liste de valeurs séparées par une virgule un ou plusieurs codes de sortie qui doivent déclencher l'événement l'action, par exemple, 50001, 50002.

      Chaque code de sortie peut être défini par l'application par lot. Codes de sortie entre 50001 et 59999 sont réservées 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 ayant échoué en raison à 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"
            }
          }
        ]
      }
    }
    
  2. 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 de la tâche.

    • LOCATION: emplacement du travail.

    • JSON_CONFIGURATION_FILE: chemin d'accès d'un fichier JSON contenant les détails de configuration du job.

API

Envoyez une requête POST à 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 des 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: le ID du projet de votre projet.

  • LOCATION: emplacement du travail.

  • JOB_NAME: nom de la tâche.

  • MAX_RETRY_COUNT: nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être 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 de ne pas relancer de tâches.

  • ACTION: action, soit RETRY_TASK ou FAIL_TASK, que vous souhaitez pour les tâches qui échouent les codes de sortie spécifiés. Tâches qui échouent avec une sortie non spécifiée les codes effectuent l'autre action.

  • EXIT_CODES: liste de valeurs séparées par une virgule un ou plusieurs codes de sortie qui doivent déclencher l'événement l'action, par exemple, 50001, 50002.

    Chaque code de sortie peut être défini par l'application par lot. Codes de sortie entre 50001 et 59999 sont réservées 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 ayant échoué en raison à 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

Éventuellement, 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 mettez à jour vos exécutables afin d'utiliser Variable d'environnement prédéfinie BATCH_TASK_RETRY_ATTEMPT. La variable BATCH_TASK_RETRY_ATTEMPT décrit le nombre de fois que cette tâche a déjà été tentée. Utilisez le la variable BATCH_TASK_RETRY_ATTEMPT dans vos exécutables si vous souhaitez pour qu'une tâche se comporte différemment selon le nombre de tentatives. Par exemple, lorsqu'une tâche est en cours de nouvelle tentative, vous pouvez confirmer quelles commandes ont déjà été exécutées avec succès dans la précédente tentative. Pour en savoir plus, consultez Variables d'environnement prédéfinies.

Étape suivante