Automatizzare i tentativi di esecuzione delle attività

Questa pagina descrive come riprovare automaticamente le attività dopo tutti o alcuni errori.

Un job batch non riesce quando almeno uno dei suoi task non va a buon fine, il che può accadere per vari motivi. Per impostazione predefinita, ogni attività in un job viene eseguita una sola volta; se un'attività non va a buon fine, non viene riprovata. Tuttavia, alcuni problemi che causano l'errore di un'attività possono essere risolti facilmente riprovando a eseguirla. In questi casi, la configurazione del job per riprovare automaticamente le attività può contribuire in modo sostanziale a ridurre i problemi di risoluzione dei problemi e il tempo di esecuzione complessivo dei job.

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

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

  • Per impostazione predefinita, ogni attività non viene ritentata in caso di errore.
  • Riprova le attività per tutti gli errori: puoi configurare il numero massimo di tentativi automatici per le attività non riuscite. Puoi specificare tra 0 (valore predefinito) e 10 tentativi.
  • Riprova le attività per alcuni errori: puoi configurare diverse azioni per le attività, ovvero riprovare automaticamente o non riprovare, per errori specifici. L'azione opposta viene intrapresa per tutti gli errori non specificati. Errori specifici possono essere identificati ciascuno da un codice di uscita definito dall'applicazione o da Batch.

Prima di iniziare

  1. Se non hai mai utilizzato Batch, consulta la sezione Guida introduttiva a Batch e attiva Batch completando i prerequisiti per progetti e utenti.
  2. Per ottenere le autorizzazioni necessarie per creare un job, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

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 gcloud CLI 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 specifica 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 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 è specificato, il valore predefinito è 0, il che significa non riprovare a eseguire alcuna 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 sede 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 script di base che specifichi il numero massimo di tentativi per le attività non riuscite, invia 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: l'ID progetto del tuo progetto.

  • LOCATION: la sede del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: Il numero massimo di 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 è specificato, il valore predefinito è 0, il che significa non riprovare a eseguire alcuna attività.

Riprova le attività per alcuni errori

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

Una norma del ciclo di vita è costituita da un'azione (campo action), da una condizione di azione (campo actionCondition) e da un codice di uscita (campo exitCodes[]). L'azione specificata viene eseguita ogni volta che si verifica la condizione di 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 riprovate.
  • FAIL_TASK: non riprovare le attività non riuscite con i codici di uscita specificati nel campo exitCodes[]. Le attività non riuscite con codici di uscita non specificati vengono riprovate.

In particolare, le attività non riuscite con codici di uscita non specificati intraprendono l'azione opposta: alcuni codici di uscita vengono riprovati e altri non riescono. Di conseguenza, affinché il criterio del ciclo di vita funzioni come previsto, devi anche definire il numero massimo di nuovi tentativi automatici (campo maxRetryCount) per consentire al job di riprovare automaticamente le attività non riuscite almeno una volta.

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

Puoi specificare che un job tenti di nuovo o non riesca a eseguire le attività dopo errori specifici utilizzando gcloud CLI o l'API Batch.

gcloud

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

    Per creare un job di script di base che riprova le 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 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 è specificato, il valore predefinito è 0, il che significa non riprovare a eseguire alcuna attività.

    • ACTION: l'azione, RETRY_TASK o FAIL_TASK, che vuoi per le attività non riuscite con i codici di uscita specificati. Le attività che non riescono a essere completate con codici di uscita non specificati intraprendono 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 riservati da Batch. Per ulteriori informazioni sui codici di uscita riservati, consulta la sezione Risoluzione dei problemi.

    Ad esempio, il seguente job riprova solo le attività non riuscite a causa del preempt 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 sede 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 riprova 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: l'ID progetto del tuo progetto.

  • LOCATION: la sede del lavoro.

  • JOB_NAME: il nome del job.

  • MAX_RETRY_COUNT: il numero massimo di 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 è specificato, il valore predefinito è 0, il che significa non riprovare a eseguire alcuna attività.

  • ACTION: l'azione, RETRY_TASK o FAIL_TASK, che vuoi per le attività non riuscite con i codici di uscita specificati. Le attività che non riescono a essere completate con codici di uscita non specificati intraprendono 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 riservati da Batch. Per ulteriori informazioni sui codici di uscita riservati, consulta la sezione Risoluzione dei problemi.

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

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

Se vuoi, dopo aver attivato i tentativi automatici per un'attività come descritto nelle sezioni precedenti di questa pagina, puoi aggiornare i runnable in modo che utilizzino la variabile di ambiente predefinita BATCH_TASK_RETRY_ATTEMPT. La variabile BATCH_TASK_RETRY_ATTEMPT descrive il numero di tentativi già eseguiti per questa attività. Utilizza la variabile BATCH_TASK_RETRY_ATTEMPT nei tuoi eseguibili se vuoi che un'attività si comporti in modo diverso in base al numero di tentativi. Ad esempio, quando viene eseguito un nuovo tentativo per un'attività, potresti voler verificare quali comandi sono stati eseguiti correttamente nel tentativo precedente. Per maggiori informazioni, vedi Variabili di ambiente predefinite.

Passaggi successivi