Automatizza i nuovi tentativi delle attività

In questa pagina viene descritto come riprovare automaticamente le attività dopo tutti o alcuni errori.

Un job batch ha esito negativo quando almeno una delle sue attività non riesce, il che può verificarsi per vari motivi. Per impostazione predefinita, ogni attività in un job viene eseguita una sola volta; se un'attività non riesce, non viene tentata di nuovo. Tuttavia, alcuni problemi che causano la mancata riuscita di un'attività possono essere facilmente risolti semplicemente riprovando. In questi casi, configurare il job in modo che ripeta automaticamente le attività può contribuire a ridurre notevolmente le difficoltà riscontrate durante la risoluzione dei problemi e il tempo di esecuzione complessivo dei job.

I nuovi tentativi automatici sono adatti alle attività a basso accoppiamento (indipendenti) e possono essere utili per una serie di problemi. Ad esempio, i nuovi tentativi automatici di attività possono risolvere problemi urgenti, come i seguenti:

Puoi configurare i nuovi tentativi automatici di ciascuna attività quando crei un job. In particolare, per ogni attività, puoi utilizzare una delle seguenti opzioni di configurazione:

  • Per impostazione predefinita, ogni attività non viene tentata di nuovo in caso di errore.
  • Riprovare le attività per tutti gli errori: puoi configurare il numero massimo di tentativi automatici per le attività non riuscite. Puoi specificare un numero di tentativi compreso tra 0 (predefinito) e 10.
  • Riprovare le attività per alcuni errori: puoi configurare diverse azioni per le attività, ad esempio un nuovo tentativo automatico o un tentativo non riuscito senza nuovi tentativi, per errori specifici. Per tutti gli errori non specificati viene intrapresa l'azione opposta. Ciascun errore specifico può essere identificato da un codice di uscita definito dall'applicazione o dal batch.

Prima di iniziare

Riprova le attività per tutti gli errori

Puoi definire il numero massimo di nuovi tentativi automatici (campo maxRetryCount) per le attività non riuscite di un job utilizzando l'interfaccia a riga di comando gcloud o l'API Batch.

gcloud

  1. Crea un file JSON che specifichi i dettagli di configurazione del job e il campo maxRetryCount.

    Ad esempio, per creare un job di script di base che specifichi il numero massimo di tentativi per le attività non riuscite, crea un file JSON con i seguenti contenuti:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ],
            
            "maxRetryCount": MAX_RETRY_COUNT
            
          },
          "taskCount": 3
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Sostituisci MAX_RETRY_COUNT con il numero massimo di nuovi tentativi per ogni attività. Affinché un job possa riprovare le attività non riuscite, questo valore deve essere impostato su un numero intero compreso tra 1 e 10. Se il campo maxRetryCount non viene specificato, il valore predefinito è 0, il che significa di non riprovare nessuna attività.

  2. Per creare ed eseguire il job, utilizza il comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Sostituisci quanto segue:

    • JOB_NAME: il nome del job.

    • LOCATION: la località del lavoro.

    • JSON_CONFIGURATION_FILE: il percorso di un file JSON con i dettagli di configurazione del job.

API

Invia una richiesta POST al metodo jobs.create che specifica il campo maxRetryCount.

Ad esempio, per creare un job di script di base che specifichi il numero massimo di tentativi per le attività non riuscite, effettua la richiesta seguente:

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"
  }
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto del progetto.

  • LOCATION: la località del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: il numero massimo di nuovi tentativi per ogni attività. Affinché un job possa riprovare le attività non riuscite, questo valore deve essere impostato su un numero intero compreso tra 1 e 10. Se il campo maxRetryCount non viene specificato, il valore predefinito è 0, il che significa di non riprovare nessuna attività.

Riprova le attività per alcuni errori

Puoi definire la modalità di gestione di diversi errori delle attività in un job utilizzando i criteri del ciclo di vita (campo lifecyclePolicies[]).

Un criterio del ciclo di vita è costituito da un'azione (campo action), una condizione di azione (campo actionCondition) e un codice di uscita (campo exitCodes[]). L'azione specificata viene eseguita ogni volta che si verifica la condizione dell'azione, ovvero un codice di uscita specifico. Puoi specificare una delle seguenti azioni:

  • RETRY_TASK: riprova le attività non riuscite con i codici di uscita specificati nel campo exitCodes[]. Le attività non riuscite con codici di uscita non specificati non vengono tentate di nuovo.
  • FAIL_TASK: non riprovare le attività che non vanno a buon fine con i codici di uscita specificati nel campo exitCodes[]. Le attività non riuscite con codici di uscita non specificati vengono tentati nuovamente.

In particolare, tutte le attività che non vanno a buon fine con codici di uscita non specificati eseguono l'azione opposta: alcuni codici di uscita vengono tentati di nuovo, mentre altri non vanno a buon fine. Di conseguenza, affinché il criterio di ciclo di vita funzioni come previsto, devi anche definire il numero massimo di tentativi automatici (campo maxRetryCount) per consentire al job di ritentare automaticamente le attività non riuscite almeno una volta.

Ogni codice di uscita rappresenta un errore specifico definito dall'applicazione o dal batch. I codici di uscita da 50001 a 59999 sono riservati e definiti da Batch. Per ulteriori informazioni sui codici di uscita prenotati, consulta la sezione Risoluzione dei problemi.

Puoi specificare che un job possa riprovare o non riuscire le attività dopo errori specifici utilizzando l'interfaccia a riga di comando gcloud CLI'API Batch.

gcloud

  1. Crea un file JSON che specifichi i dettagli di configurazione del job, il campo maxRetryCount e i sottocampi lifecyclePolicies[].

    Per creare un job di script di base che ripete un nuovo tentativo di attività non riuscite solo per alcuni codici di uscita, crea un file JSON con i seguenti contenuti:

    {
      "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"
      }
    }
    

    Sostituisci quanto segue:

    • MAX_RETRY_COUNT: il numero massimo di nuovi tentativi per ogni attività. Affinché un job possa riprovare le attività non riuscite, questo valore deve essere impostato su un numero intero compreso tra 1 e 10. Se il campo maxRetryCount non viene specificato, il valore predefinito è 0, il che significa di non riprovare nessuna attività.

    • ACTION: l'azione, RETRY_TASK o FAIL_TASK, che vuoi per le attività che non superano i codici di uscita specificati. Le attività non riuscite con codici di uscita non specificati eseguono l'altra azione.

    • EXIT_CODES: un elenco separato da virgole di uno o più codici di uscita che vuoi attivare l'azione specificata, ad esempio 50001, 50002.

      Ogni codice di uscita può essere definito dall'applicazione o dal batch. I codici di uscita da 50001 a 59999 sono prenotati da Batch. Per ulteriori informazioni sui codici di uscita prenotati, consulta la sezione Risoluzione dei problemi.

    Ad esempio, il job seguente esegue un nuovo tentativo solo per le attività non riuscite a causa del prerilascio delle 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. Per creare ed eseguire il job, utilizza il comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Sostituisci quanto segue:

    • JOB_NAME: il nome del job.

    • LOCATION: la località del lavoro.

    • JSON_CONFIGURATION_FILE: il percorso di un file JSON con i dettagli di configurazione del job.

API

Invia una richiesta POST al metodo jobs.create che specifica il campo maxRetryCount e i campi secondari lifecyclePolicies[].

Per creare un job di script di base che ripete un nuovo tentativo di attività non riuscite solo per alcuni codici di uscita, effettua la richiesta seguente:

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"
  }
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto del progetto.

  • LOCATION: la località del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: il numero massimo di nuovi tentativi per ogni attività. Affinché un job possa riprovare le attività non riuscite, questo valore deve essere impostato su un numero intero compreso tra 1 e 10. Se il campo maxRetryCount non viene specificato, il valore predefinito è 0, il che significa di non riprovare nessuna attività.

  • ACTION: l'azione, RETRY_TASK o FAIL_TASK, che vuoi per le attività che non superano i codici di uscita specificati. Le attività non riuscite con codici di uscita non specificati eseguono l'altra azione.

  • EXIT_CODES: un elenco separato da virgole di uno o più codici di uscita che vuoi attivare l'azione specificata, ad esempio 50001, 50002.

    Ogni codice di uscita può essere definito dall'applicazione o dal batch. I codici di uscita da 50001 a 59999 sono prenotati da Batch. Per ulteriori informazioni sui codici di uscita prenotati, consulta la sezione Risoluzione dei problemi.

Ad esempio, il job seguente esegue un nuovo tentativo solo per le attività non riuscite a causa del prerilascio delle 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"
        }
      }
    ]
  }
}

Passaggi successivi