Aufgabenwiederholungen automatisieren

Auf dieser Seite wird beschrieben, wie Sie Aufgaben nach allen oder einigen Fehlern automatisch wiederholen können.

Ein Batch-Job schlägt aus verschiedenen Gründen fehl, wenn mindestens eine seiner Aufgaben fehlschlägt. Standardmäßig wird jede Aufgabe in einem Job nur einmal ausgeführt. Wenn eine Aufgabe fehlschlägt, wird sie nicht wiederholt. Einige Probleme, die zum Fehlschlagen einer Aufgabe führen, lassen sich jedoch einfach beheben, indem Sie die Aufgabe wiederholen. In diesen Fällen kann die Konfiguration des Jobs so konfiguriert werden, dass Aufgaben automatisch wiederholt werden. Das kann die Fehlerbehebung und die Gesamtausführungszeit von Jobs erheblich reduzieren.

Automatische Wiederholungsversuche eignen sich gut für los gekoppelte (unabhängige) Aufgaben und können bei einer Vielzahl von Problemen helfen. Durch automatische Aufgabenwiederholungen lassen sich beispielsweise zeitkritische Probleme wie die folgenden beheben:

Sie können beim Erstellen eines Jobs automatische Aufgabenwiederholungen für jede Aufgabe konfigurieren. Insbesondere können Sie für jede Aufgabe eine der folgenden Konfigurationsoptionen verwenden:

  • Standardmäßig wird keine Aufgabe wiederholt, wenn sie fehlschlägt.
  • Aufgaben für alle Fehler wiederholen: Sie können festlegen, wie oft fehlgeschlagene Tasks maximal automatisch wiederholt werden sollen. Sie können zwischen 0 (Standardeinstellung) und 10 Wiederholungen angeben.
  • Aufgaben bei einigen Fehlern wiederholen: Für bestimmte Fehler können Sie verschiedene Aufgabenaktionen konfigurieren – entweder automatisch oder ohne Wiederholungsversuch. Für alle nicht angegebenen Fehler wird die gegenteilige Aktion ausgeführt. Spezifische Fehler lassen sich jeweils durch einen von Ihrer Anwendung oder Batch definierten Exit-Code identifizieren.

Hinweise

Aufgaben bei allen Fehlern wiederholen

Sie können die maximale Anzahl automatischer Wiederholungsversuche (Feld maxRetryCount) für die fehlgeschlagenen Aufgaben eines Jobs mithilfe der gcloud CLI oder Batch API definieren.

gcloud

  1. Erstellen Sie eine JSON-Datei, die die Konfigurationsdetails des Jobs und das Feld maxRetryCount angibt.

    Um beispielsweise einen einfachen Skriptjob zu erstellen, der die maximale Anzahl von Wiederholungen für fehlgeschlagene Aufgaben angibt, erstellen Sie eine JSON-Datei mit folgendem Inhalt:

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

    Ersetzen Sie MAX_RETRY_COUNT durch die maximale Anzahl von Wiederholungen für jede Aufgabe. Damit ein Job fehlgeschlagene Aufgaben wiederholen kann, muss dieser Wert auf eine Ganzzahl zwischen 1 und 10 festgelegt werden. Wenn das Feld maxRetryCount nicht angegeben ist, ist der Standardwert 0. Das bedeutet, dass keine Aufgaben wiederholt werden.

  2. Verwenden Sie den Befehl gcloud batch jobs submit, um den Job zu erstellen und auszuführen:

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

    Ersetzen Sie Folgendes:

    • JOB_NAME: der Name des Jobs.

    • LOCATION: der Standort des Jobs.

    • JSON_CONFIGURATION_FILE: der Pfad für eine JSON-Datei mit den Konfigurationsdetails des Jobs.

API

Stellen Sie eine POST-Anfrage an die Methode jobs.create, die das Feld maxRetryCount angibt.

Um beispielsweise einen einfachen Skriptjob zu erstellen, der die maximale Anzahl von Wiederholungen für fehlgeschlagene Aufgaben angibt, stellen Sie die folgende Anfrage:

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

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID Ihres Projekts.

  • LOCATION: der Standort des Jobs.

  • JOB_NAME: der Name des Jobs.

  • MAX_RETRY_COUNT: Die maximale Anzahl der Wiederholungsversuche für jede Aufgabe. Damit ein Job fehlgeschlagene Aufgaben wiederholen kann, muss dieser Wert auf eine Ganzzahl zwischen 1 und 10 festgelegt werden. Wenn das Feld maxRetryCount nicht angegeben ist, ist der Standardwert 0. Das bedeutet, dass keine Aufgaben wiederholt werden.

Aufgaben bei einigen Fehlern wiederholen

Mit Lebenszyklusrichtlinien (Feld lifecyclePolicies[]) können Sie festlegen, wie ein Job verschiedene Aufgabenfehler behandeln soll.

Eine Lebenszyklusrichtlinie besteht aus einer Aktion (Feld action), einer Aktionsbedingung (Feld actionCondition) und einem Exit-Code (Feld exitCodes[]). Die angegebene Aktion wird immer dann ausgeführt, wenn die Aktionsbedingung – ein bestimmter Exit-Code – auftritt. Sie können eine der folgenden Aktionen angeben:

  • RETRY_TASK: Wiederholung von Aufgaben, die mit den im Feld exitCodes[] angegebenen Exit-Codes fehlschlagen. Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, werden nicht wiederholt.
  • FAIL_TASK: Es werden keine Aufgaben wiederholt, die mit den im Feld exitCodes[] angegebenen Exit-Codes fehlschlagen. Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, werden wiederholt.

Insbesondere alle Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, führen die entgegengesetzte Aktion aus. Einige Exit-Codes werden wiederholt und andere schlagen fehl. Damit die Lebenszyklusrichtlinie wie erwartet funktioniert, müssen Sie auch die maximale Anzahl automatischer Wiederholungsversuche (Feld maxRetryCount) definieren, damit der Job fehlgeschlagene Aufgaben mindestens einmal automatisch wiederholt.

Jeder Exit-Code steht für einen bestimmten Fehler, der entweder von Ihrer Anwendung oder Batch definiert wird. Die Exit-Codes von 50001 bis 59999 sind reserviert und für Batch definiert. Weitere Informationen zu den reservierten Exit-Codes finden Sie unter Fehlerbehebung.

Mit der gcloud CLI oder Batch API können Sie festlegen, dass ein Job Aufgaben nach bestimmten Fehlern wiederholt oder fehlschlägt.

gcloud

  1. Erstellen Sie eine JSON-Datei, die die Konfigurationsdetails des Jobs, das Feld maxRetryCount und die Unterfelder lifecyclePolicies[] angibt.

    Um einen einfachen Skriptjob zu erstellen, der fehlgeschlagene Aufgaben nur für einige Exit-Codes wiederholt, erstellen Sie eine JSON-Datei mit folgendem Inhalt:

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

    Ersetzen Sie Folgendes:

    • MAX_RETRY_COUNT: die maximale Anzahl der Wiederholungsversuche für jede Aufgabe. Damit ein Job fehlgeschlagene Aufgaben wiederholen kann, muss dieser Wert auf eine Ganzzahl zwischen 1 und 10 festgelegt werden. Wenn das Feld maxRetryCount nicht angegeben ist, ist der Standardwert 0. Das bedeutet, dass keine Aufgaben wiederholt werden.

    • ACTION: Die Aktion, entweder RETRY_TASK oder FAIL_TASK, die für Aufgaben ausgeführt werden soll, die mit den angegebenen Exit-Codes fehlschlagen. Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, führen die andere Aktion aus.

    • EXIT_CODES: eine durch Kommas getrennte Liste eines oder mehrerer Exit-Codes, die die angegebene Aktion auslösen sollen, z. B. 50001, 50002.

      Jeder Exit-Code kann von Ihrer Anwendung oder Ihrem Batch definiert werden. Die Exit-Codes von 50001 bis 59999 sind von Batch reserviert. Weitere Informationen zu den reservierten Exit-Codes finden Sie unter Fehlerbehebung.

    Der folgende Job wiederholt beispielsweise nur Aufgaben, die aufgrund des vorzeitigen Beendens von Spot-VMs fehlschlagen.

    {
      "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. Verwenden Sie den Befehl gcloud batch jobs submit, um den Job zu erstellen und auszuführen:

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

    Ersetzen Sie Folgendes:

    • JOB_NAME: der Name des Jobs.

    • LOCATION: der Standort des Jobs.

    • JSON_CONFIGURATION_FILE: der Pfad für eine JSON-Datei mit den Konfigurationsdetails des Jobs.

API

Stellen Sie eine POST-Anfrage an die Methode jobs.create, die das Feld maxRetryCount und die untergeordneten Felder lifecyclePolicies[] angibt.

Um einen einfachen Skriptjob zu erstellen, der fehlgeschlagene Aufgaben nur für einige Exit-Codes wiederholt, stellen Sie die folgende Anfrage:

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

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID Ihres Projekts.

  • LOCATION: der Standort des Jobs.

  • JOB_NAME: der Name des Jobs.

  • MAX_RETRY_COUNT: die maximale Anzahl der Wiederholungsversuche für jede Aufgabe. Damit ein Job fehlgeschlagene Aufgaben wiederholen kann, muss dieser Wert auf eine Ganzzahl zwischen 1 und 10 festgelegt werden. Wenn das Feld maxRetryCount nicht angegeben ist, ist der Standardwert 0. Das bedeutet, dass keine Aufgaben wiederholt werden.

  • ACTION: Die Aktion, entweder RETRY_TASK oder FAIL_TASK, die für Aufgaben ausgeführt werden soll, die mit den angegebenen Exit-Codes fehlschlagen. Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, führen die andere Aktion aus.

  • EXIT_CODES: eine durch Kommas getrennte Liste eines oder mehrerer Exit-Codes, die die angegebene Aktion auslösen sollen, z. B. 50001, 50002.

    Jeder Exit-Code kann von Ihrer Anwendung oder Ihrem Batch definiert werden. Die Exit-Codes von 50001 bis 59999 sind von Batch reserviert. Weitere Informationen zu den reservierten Exit-Codes finden Sie unter Fehlerbehebung.

Der folgende Job wiederholt beispielsweise nur Aufgaben, die aufgrund des vorzeitigen Beendens von Spot-VMs fehlschlagen.

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

Aufgabenverhalten auf Grundlage der Anzahl der Wiederholungsversuche ändern

Nachdem Sie die automatischen Wiederholungsversuche für eine Aufgabe aktiviert haben, wie in den vorherigen Abschnitten auf dieser Seite beschrieben, können Sie die Runnables auch so aktualisieren, dass die vordefinierte Umgebungsvariable BATCH_TASK_RETRY_ATTEMPT verwendet wird. Die Variable BATCH_TASK_RETRY_ATTEMPT beschreibt, wie oft diese Aufgabe bereits versucht wurde. Verwenden Sie die Variable BATCH_TASK_RETRY_ATTEMPT in Ihren Runnables, wenn sich eine Aufgabe je nach Anzahl der Wiederholungsversuche anders verhalten soll. Wenn beispielsweise eine Aufgabe wiederholt wird, können Sie prüfen, welche Befehle beim vorherigen Versuch bereits erfolgreich ausgeführt wurden. Weitere Informationen finden Sie unter Vordefinierte Umgebungsvariablen.

Nächste Schritte