Automatizzare i nuovi tentativi in un'attività

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

Un job batch non va a buon fine quando almeno una delle sue attività non va a buon fine, il che può avvengono per vari motivi. Per impostazione predefinita, ogni attività in un job viene eseguita una sola volta; if un'attività non riesce, non viene ritentata. Tuttavia, alcuni problemi che causano un errore può essere facilmente risolto semplicemente riprovando l'attività. In questi casi, la configurazione del job in modo che ripeta automaticamente le attività può aiutare notevolmente a ridurre le difficoltà di risoluzione dei problemi e il tempo di esecuzione complessivo dei job.

I nuovi tentativi automatici sono adatti attività a basso accoppiamento (indipendenti) e può aiutarti a risolvere vari problemi. Ad esempio, nuovi tentativi automatici di attività può risolvere problemi urgenti quali:

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

  • Per impostazione predefinita, ogni attività non viene ritentata quando non riesce.
  • Riprova le attività per tutti gli errori: puoi configurare il numero massimo di volte in cui ripetere automaticamente le attività non riuscite. Tu puoi specificare un numero di tentativi compreso tra 0 (predefinito) e 10.
  • Ripetere le attività per alcuni errori: Puoi configurare attività diverse diverse, ovvero un nuovo tentativo automatico o un errore senza nuovi tentativi, errori specifici. Per tutti gli errori non specificati viene eseguita l'azione opposta. Gli errori specifici possono essere identificati da un codice di uscita definiti dalla tua applicazione o da Batch.

Prima di iniziare

Riprova le attività per tutti gli errori

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

gcloud

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

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

    {
      "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 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 non ritentare alcuna attività.

  2. Per creare ed eseguire il job, utilizza la classe 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 a Metodo jobs.create che specifica il campo maxRetryCount.

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

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: il valore ID progetto del tuo progetto.

  • LOCATION: la località del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: il numero massimo 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 non ritentare alcuna attività.

Riprova le attività per alcuni errori

Puoi definire in che modo un job deve gestire i diversi errori delle attività utilizzando criteri del ciclo di vita (campo lifecyclePolicies[]).

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

  • RETRY_TASK: riprova le attività non riuscite con i codici di uscita specificati nel exitCodes[]. Le attività che hanno esito negativo con codici di uscita non specificati vengono non riprovato.
  • FAIL_TASK: non riprovare le attività non riuscite con i codici di uscita specificati nel exitCodes[]. Le attività che hanno esito negativo con codici di uscita non specificati vengono nuovo tentativo.

In particolare, tutte le attività che non hanno esito positivo con codici di uscita non specificati all'azione opposta: è stato eseguito un nuovo tentativo con alcuni codici di uscita, mentre altri non hanno esito positivo. Di conseguenza, affinché i criteri del ciclo di vita funzionino come previsto, devi anche definire numero massimo di nuovi tentativi automatici (campo maxRetryCount) per consentire al job di riprovare automaticamente le attività non riuscite almeno una volta.

Ciascun codice di uscita rappresenta un errore specifico definito dalla tua applicazione o da Batch. I codici di uscita da 50001 a 59999 sono riservati e definiti Batch. Per ulteriori informazioni sui codici di uscita riservati, consulta Risoluzione dei problemi.

Puoi specificare se un job può riprovare o non riuscire in attività dopo specifici errori con gcloud CLI o l'API Batch.

gcloud

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

    Per creare un job di script di base che ripeta le attività non riuscite solo per alcuni codici di uscita, crea un file JSON con il contenuto seguente:

    {
      "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 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 non ritentare alcuna attività.

    • ACTION: l'azione RETRY_TASK o FAIL_TASK, che vuoi per le attività che non hanno avuto esito positivo i codici di uscita specificati. Attività che non hanno esito positivo con uscita non specificata i codici eseguono l'altra azione.

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

      Ogni codice di uscita può essere definito dall'applicazione Batch. I codici di uscita da 50001 a 59999 sono riservate da Batch. Per ulteriori informazioni sui codici di uscita riservati, consulta Risoluzione dei problemi.

    Ad esempio, il seguente job ritenta solo le attività non riuscite a causa il 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 la classe 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 a Metodo jobs.create che specifica il campo maxRetryCount e i sottocampi lifecyclePolicies[].

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

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: il valore ID progetto del tuo progetto.

  • LOCATION: la località del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: il numero massimo 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 non ritentare alcuna attività.

  • ACTION: l'azione RETRY_TASK o FAIL_TASK, che vuoi per le attività che non hanno avuto esito positivo i codici di uscita specificati. Attività che non hanno esito positivo con uscita non specificata i codici eseguono l'altra azione.

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

    Ogni codice di uscita può essere definito dall'applicazione Batch. I codici di uscita da 50001 a 59999 sono riservate da Batch. Per ulteriori informazioni sui codici di uscita riservati, consulta Risoluzione dei problemi.

Ad esempio, il seguente job ritenta solo le attività non riuscite a causa il 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"
        }
      }
    ]
  }
}

Modifica il comportamento dell'attività in base al numero di nuovi tentativi

Se vuoi, dopo aver abilitato i nuovi tentativi automatici per un'attività come descritto nelle sezioni precedenti di questa pagina, puoi aggiorna i tuoi runnable per utilizzare BATCH_TASK_RETRY_ATTEMPT variabile di ambiente predefinita. La variabile BATCH_TASK_RETRY_ATTEMPT descrive il numero di volte che questa attività è già stata tentata. Utilizza la BATCH_TASK_RETRY_ATTEMPT nei tuoi elementi eseguibili, se vuoi un comportamento diverso di un'attività in base al numero di nuovi tentativi. Ad esempio, quando un'attività viene ritentata, potresti voler per confermare quali comandi sono già stati eseguiti nel tentativo precedente. Per ulteriori informazioni, vedi Variabili di ambiente predefinite.

Passaggi successivi