Aufgabenwiederholungen automatisieren

Auf dieser Seite wird beschrieben, wie Aufgaben nach allen oder einigen Fehlern automatisch wiederholt werden.

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. 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. Dadurch können Sie die Probleme bei der Fehlerbehebung und die Gesamtausführungszeit Ihrer 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 können beispielsweise zeitkritische Probleme wie die folgenden behoben werden:

Beim Erstellen eines Jobs können Sie 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 bei allen Fehlern wiederholen: Sie können die maximalen Zeiten für die automatische Wiederholung fehlgeschlagener Aufgaben konfigurieren. Sie können einen Wiederholungsversuch zwischen 0 (Standardeinstellung) und 10 Wiederholungen festlegen.
  • Aufgaben bei einigen Fehlern wiederholen: Sie können für bestimmte Fehler verschiedene Aufgabenaktionen konfigurieren. Diese können entweder automatisch wiederholt werden oder ohne Wiederholungsversuche fehlschlagen. Für alle nicht angegebenen Fehler wird die gegenteilige Aktion ausgeführt. Spezifische Fehler können jeweils durch einen von der Anwendung oder Batch definierten Exit-Code identifiziert werden.

Hinweise

Aufgaben bei 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.

    Wenn Sie beispielsweise einen einfachen Skriptjob erstellen möchten, 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 Wiederholungsversuchen 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.

Wenn Sie beispielsweise einen einfachen Skriptjob erstellen möchten, 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

Mithilfe von Lebenszyklusrichtlinien (Feld lifecyclePolicies[]) können Sie definieren, 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 – eintritt. Sie können eine der folgenden Aktionen festlegen:

  • 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: Keine Wiederholung von Aufgaben, die mit den im Feld exitCodes[] angegebenen Exit-Codes fehlschlagen. Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, werden wiederholt.

Vor allem, wenn Aufgaben mit nicht angegebenen Exit-Codes fehlschlagen, wird die entgegengesetzte Aktion ausgeführt. Einige Exit-Codes werden wiederholt, 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 automatisch mindestens einmal wiederholen kann.

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

Sie können mithilfe der gcloud CLI oder Batch API für einen Job festlegen, dass Aufgaben nach bestimmten Fehlern wiederholt werden oder fehlschlagen sollen.

gcloud

  1. Erstellen Sie eine JSON-Datei, die die Konfigurationsdetails des Jobs, 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, 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 (RETRY_TASK oder FAIL_TASK), die Sie für Aufgaben ausführen möchten, die mit den angegebenen Exit-Codes fehlschlagen. Bei Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, wird die andere Aktion ausgeführt.

    • EXIT_CODES: eine durch Kommas getrennte Liste mit einem oder mehreren 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.

    Mit dem folgenden Job werden nur Aufgaben wiederholt, 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, mit der das Feld maxRetryCount und die Unterfelder lifecyclePolicies[] angegeben werden.

Um einen einfachen Skriptjob zu erstellen, der fehlgeschlagene Aufgaben nur für einige Exit-Codes wiederholt, senden 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 (RETRY_TASK oder FAIL_TASK), die Sie für Aufgaben ausführen möchten, die mit den angegebenen Exit-Codes fehlschlagen. Bei Aufgaben, die mit nicht angegebenen Exit-Codes fehlschlagen, wird die andere Aktion ausgeführt.

  • EXIT_CODES: eine durch Kommas getrennte Liste mit einem oder mehreren 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.

Mit dem folgenden Job werden nur Aufgaben wiederholt, 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"
        }
      }
    ]
  }
}

Nächste Schritte