Aufgabenabhängigkeiten mit Task-Graphen verwalten¶
Mit Task-Graphen (oder Aufgabendiagrammen) können Sie Sequenzen von Aufgaben automatisch ausführen. Ein Task-Graph ist ein Directed Acyclic Graph (DAG), der aus einer Reihe von Aufgaben besteht, die aus einer Stammaufgabe (Root Task) und untergeordneten Aufgaben (Child Tasks) besteht, die nach ihren Abhängigkeiten organisiert sind. Task-Graphen fließen in eine einzige Richtung, d. h. eine spätere Aufgabe in der Reihe kann nicht die Ausführung einer früheren Aufgabe veranlassen. Jede Aufgabe kann von mehreren anderen Aufgaben abhängen und wird erst ausgeführt, wenn diese alle abgeschlossen sind. Jede Aufgabe kann auch mehrere untergeordnete Aufgaben haben, die von ihr abhängen.
Aufgaben in einem Diagramm können auch die Rückgabewerte übergeordneter Objekte verwenden, um logikbasierte Operationen in ihrem SQL-Funktionshauptteil durchzuführen.
Task-Graphen erstellen¶
Um einen Task-Graphen zu erstellen, geben Sie übergeordnete Aufgaben an, wenn Sie eine Aufgabe erstellen oder ändern. Die Stammaufgabe Ihres Task-Graphen ist die Aufgabe, die keine übergeordneten Aufgaben hat. Die Stammaufgabe sollte einen definierten Zeitplan haben, der die Ausführung des Task-Graphen auslöst. Jede untergeordnete Aufgabe muss mindestens eine definierte übergeordnete Aufgabe haben, um die Aufgaben im Task-Graphen zu verknüpfen.
Verwenden Sie die Befehle CREATE TASK … AFTER oder ALTER TASK … ADD AFTER, um untergeordnete Aufgaben hinzuzufügen. Sie können Ihre Snowflake-Aufgaben und Task-Graphen auch mit Python verwalten. Weitere Informationen dazu finden Sie unter Verwalten von Snowflake-Aufgaben und Task-Graphen mit Python.
- Hinweise zu Task-Graphen
Ein Task-Graph ist auf maximal 1.000 Aufgaben beschränkt.
Eine einzelne Aufgabe kann maximal 100 übergeordnete Aufgaben und 100 untergeordnete Aufgaben haben.
Der Rechner, der den Task-Graphen ausführt, muss so dimensioniert sein, dass er gleichzeitige Aufgabenausführungen bewältigen kann. Weitere Informationen dazu finden Sie unter Computeressourcen.
Im folgenden einfachen Beispiel startet die Stammaufgabe gleichzeitig die Ausführung von Aufgaben B und C. Aufgabe D wird ausgeführt, wenn sowohl Aufgabe B als auch Aufgabe C abgeschlossen sind.
Das folgende praktische Beispiel zeigt, wie ein Task-Graph verwendet werden kann, um vor dem Aggregieren von Faktendaten die Dimensionstabellen einer Verkaufsdatenbank zu aktualisieren:
Das folgende Beispiel zeigt, wie die abschließende Aufgabe in einem Task-Graphen eine externe Funktion aufruft, mit der ein externer Messagingdienst veranlasst wird, eine Benachrichtigung darüber zu senden, dass alle vorherigen Aufgaben erfolgreich abgeschlossen wurden.
Eigentümerschaft des Task-Graphen verwalten¶
Alle Aufgaben eines einfachen Task-Graphen müssen denselben Aufgabeneigentümer haben und in derselben Datenbank und in demselben Schema gespeichert sein.
Sie können die Eigentümerschaft an allen Aufgaben eines Task-Graphen mit einer der folgenden Aktionen übertragen:
Löschen des Eigentümers aller Aufgaben im Task-Graphen mit DROP ROLE. Snowflake überträgt die Eigentümerschaft an die Rolle, die den Befehl DROP ROLE ausführt.
Übertragen der Eigentümerschaft aller Aufgaben im Task-Graphen mit GRANT OWNERSHIP auf alle Aufgaben in einem Schema.
Wenn Sie die Eigentümerschaft der Aufgaben in einem Task-Graph mit diesen Methoden übertragen, behalten die Aufgaben im Task-Graphen ihre Beziehungen untereinander bei.
Durch das Übertragen der Eigentümerschaft einer einzelnen Aufgabe wird die Abhängigkeit zwischen der Aufgabe und allen über- und untergeordneten Aufgaben aufgehoben. Weitere Informationen dazu finden Sie unter Übergeordnete und untergeordnete Aufgaben trennen (unter diesem Thema).
Bemerkung
Die Datenbankreplikation funktioniert nicht für Task-Graphen, wenn das Diagramm einer anderen Rolle gehört als der Rolle, die die Replikation durchführt.
Ausführen der Aufgaben eines Task-Graphen¶
Das Ausführen eines Task-Graphen wird durch die das Ausführen der definierten Stammaufgabe (Root Task) eingeleitet. Die erfolgreiche Ausführung einer Stammaufgabe löst eine kaskadierende Ausführung der untergeordneten Aufgaben im Task-Graphen aus, sobald deren vorhergehende Aufgabe abgeschlossen ist. Stammaufgaben können auf die folgenden Arten ausgeführt werden:
Aufgabenplanung – Im Allgemeinen werden Task-Graphen nach einem CRON- oder intervallbasierten Zeitplan ausgeführt.
ALTER TASK – Sie können
ALTER TASK [ IF EXISTS ] <name> RESUME
verwenden, um einen Task-Graphen auf der Grundlage eines bestehenden Zeitplans auszuführen. Alle Aufgaben müssen bei der ersten Erstellung fortgesetzt werden.EXECUTE TASK – Sie können
EXECUTE TASK <name>
verwenden, um eine einmalige Ausführung eines Task-Graphen zu erstellen.
Manuelles Ausführen von Aufgaben eines Task-Graphen¶
Der Befehl EXECUTE TASK triggert manuell eine einzelne Ausführung einer Aufgabe, unabhängig von dem für die Aufgabe definierten Zeitplan. Die erfolgreiche Ausführung einer Stammaufgabe löst eine kaskadierende Ausführung der untergeordneten Aufgaben im Task-Graphen aus, sobald deren vorhergehende Aufgabe abgeschlossen ist, so als ob die Stammaufgabe nach ihrem definierten Zeitplan ausgeführt worden wäre.
Sie können auch EXECUTE TASK <name> RETRY LAST
verwenden, um eine beliebige untergeordnete Aufgabe in einem Task-Graphen erneut auszuführen. RETRY LAST
versucht, den Task-Graphen ab der letzten fehlgeschlagenen Aufgabe auszuführen. Wenn die Aufgabe erfolgreich ist, werden alle untergeordneten Aufgaben weiter ausgeführt, sobald ihre vorhergehenden Aufgaben abgeschlossen sind.
Dieser SQL-Befehl ist nützlich, um neue oder geänderte Task-Graphen zu testen, bevor diese für die Ausführung von SQL-Code in der Produktion aktiviert werden.
Überlappende Task-Graph-Ausführung¶
Snowflake stellt standardmäßig sicher, dass jeweils nur eine Instanz eines bestimmten Task-Graphen ausgeführt wird. Die nächste Ausführung einer Stammaufgabe wird erst geplant, wenn die Ausführung aller Aufgaben im Task-Graphen beendet wurde. Das heißt, wenn die kumulierte Zeit, die für die Ausführung aller Aufgaben im Task-Graphen benötigt wird, die in der Definition der Stammaufgabe festgelegte explizit geplante Zeit überschreitet, wird mindestens eine Ausführung des Task-Graphen übersprungen. Das Verhalten wird durch den Parameter ALLOW_OVERLAPPING_EXECUTION der Stammaufgabe gesteuert. Der Standardwert ist FALSE. Wird der Parameterwert auf TRUE gesetzt, können sich Task-Graph-Ausführungen überschneiden.
Außerdem beginnt die Ausführung einer untergeordneten Aufgabe erst dann, wenn alle Vorgängeraufgaben der untergeordneten Aufgabe ihre eigenen Ausführungen erfolgreich abgeschlossen haben. Eine Aufgabe, die zeitintensive SQL-Operationen ausführt, verzögert den Start jeder nachfolgenden Aufgabe, die die Aufgabe als Vorgänger identifiziert.
Im folgenden Beispiel wird eine Task-Graph-Ausführung so geplant, dass die Ausführung gestartet wird, wenn eine vorherige Ausführung noch nicht abgeschlossen ist. Der Zeitraum der Überlappung bzw. Gleichzeitigkeit ist rot gekennzeichnet. Die Abbildung zeigt auch die Zeitspanne an, in der sich jede Aufgabe in der Warteschlange befindet, bevor sie im benutzerverwalteten Warehouse ausgeführt wird: Beachten Sie, dass es bei der Verwendung von serverlosen Computeressourcen keine Wartezeit gibt:
Überlappende Ausführungen können toleriert werden (oder sind sogar erwünscht), wenn SQL-Lese-/Schreiboperationen, die durch überlappende Ausführungen eines Task-Graphen ausgeführt werden, keine falschen oder duplizierten Daten erzeugen. Für andere Task-Graphen sollten Aufgabeneigentümer (die Rolle mit OWNERSHIP-Berechtigung für alle Aufgaben im Task-Graphen) einen geeigneten Zeitplan für die Stammaufgabe festlegen und eine geeignete Warehouse-Größe auswählen (oder serverlose Computeressourcen verwenden), um sicherzustellen, dass eine Instanz des Task-Graphen bis zum Ende ausgeführt wird, bevor die nächste Ausführung der Stammaufgabe geplant wird.
So stimmen Sie einen Task-Graphen besser mit dem in der Stammaufgabe definierten Zeitplan ab:
Erhöhen Sie, falls möglich, die Planungszeit zwischen den Ausführungen der Stammaufgabe.
Erwägen Sie, rechenintensive Aufgaben so zu ändern, dass sie serverlose Computeressourcen nutzen. Wenn die Aufgabe auf benutzerverwaltete Computeressourcen angewiesen ist, sollten Sie die Größe für das Warehouse erhöhen, das umfangreiche oder komplexe SQL-Anweisungen oder gespeicherte Prozeduren im Task-Graphen ausführt.
Analysieren Sie die SQL-Anweisungen oder gespeicherten Prozeduren, die von jeder Aufgabe ausgeführt werden. Stellen Sie fest, ob sich der Code umschreiben lässt, um die Parallelverarbeitung nutzen zu können.
Wenn keine der obigen Lösungen hilft, überlegen Sie, ob es notwendig ist, gleichzeitige Ausführungen des Task-Graphen durch Festlegen von ALLOW_OVERLAPPING_EXECUTION = TRUE für die Stammaufgabe zuzulassen. Dieser Parameter kann beim Erstellen einer Aufgabe definiert werden (mit CREATE TASK) oder später (mit ALTER TASK oder in Snowsight).
Anhalten und Fortsetzen von Aufgaben eines Task-Graphen¶
Um eine Aufgabe in einem Task-Graphen anzuhalten oder fortzusetzen, verwenden Sie ALTER TASK … RESUME SUSPEND oder Snowsight.
- Anhalten einer Stammaufgabe
Wenn die Stammaufgabe (Root Task) angehalten wird, werden alle zukünftigen geplanten Ausführungen der Stammaufgabe abgebrochen. Wenn sich Aufgaben jedoch gerade in Ausführung befinden, werden diese Aufgaben und alle nachfolgenden Aufgaben weiterhin ausgeführt.
- Fortsetzen und Anhalten von untergeordneten Aufgaben
Um eine untergeordnete Aufgabe (Child Task) fortzusetzen oder anzuhalten, müssen Sie die Stammaufgabe (Root Task) anhalten. Das Fortsetzen angehaltener untergeordneter Aufgaben ist nicht erforderlich, um die Stammaufgabe fortzusetzen.
- Aufgaben rekursiv fortsetzen
Um alle Aufgaben in einem Task-Graphen rekursiv fortzusetzen, fragen Sie die Funktion SYSTEM$TASK_DEPENDENTS_ENABLE ab.
- Task-Graph-Ausführungen mit angehaltenen untergeordneten Aufgaben
Wenn ein Task-Graph mit einer oder mehreren angehaltenen untergeordneten Aufgaben ausgeführt wird, wird die Ausführung dieser Aufgaben ignoriert. Eine untergeordnete Aufgabe mit mehreren Vorgängern wird solange ausgeführt, bis sich mindestens einer der Vorgänger im Zustand „Fortgesetzt“ befindet und alle fortgesetzten Vorgänger erfolgreich zu Ende geführt werden.
Versionieren von Task-Graphen¶
Wenn die Stammaufgabe in einem Task-Graphen fortgesetzt oder manuell ausgeführt wird, legt Snowflake eine Version für den gesamten Task-Graphen fest, einschließlich aller Eigenschaften für alle Aufgaben im Task-Graphen. Nachdem eine Aufgabe angehalten und geändert wird, legt Snowflake beim Fortsetzen oder manuellen Ausführen der Stammaufgabe eine neue Version fest.
Um eine beliebige Aufgabe in einem Task-Graphen zu ändern oder neu zu erstellen, muss zuerst die Stammaufgabe angehalten werden. Wenn die Stammaufgabe (Root Task) angehalten wird, werden alle zukünftigen geplanten Ausführungen der Stammaufgabe abgebrochen. Wenn sich Aufgaben jedoch gerade in Ausführung befinden, werden diese Aufgaben und alle nachfolgenden Aufgaben weiterhin mit der aktuellen Version ausgeführt.
Bemerkung
Wenn sich die Definition einer gespeicherten Prozedur, die von einer Aufgabe aufgerufen wurde, während der Ausführung des Task-Graphen ändert, kann der geänderte Code der gespeicherten Prozedur bei Aufruf durch die Aufgabe bereits in der aktuellen Ausführung zur Anwendung kommen.
Angenommen, die Stammaufgabe im Task-Graphen wird angehalten, aber eine geplante Ausführung dieser Aufgabe hat bereits begonnen. Der Eigentümer aller Aufgaben im Task-Graphen ändert den von einer untergeordneten Aufgabe aufgerufenen SQL-Code, während sich die Stammaufgabe noch in Ausführung befindet. Die untergeordnete Aufgabe wird ausgeführt und führt den SQL-Code in ihrer Definition aus, wobei die Version des Task-Graphen verwendet wird, die aktuell war, als die Ausführung der Stammaufgabe begann. Wenn die Stammaufgabe fortgesetzt oder manuell ausgeführt wird, wird eine neue Version des Task-Graphen erstellt. Diese neue Version enthält die an der untergeordneten Aufgabe vorgenommenen Änderungen.
Um den Versionsverlauf der Aufgabenversionen abzurufen, fragen Sie die Account Usage-Ansicht TASK_VERSIONS (in der freigegebenen SNOWFLAKE-Datenbank) ab.
Task-Graphen nach fehlgeschlagenen Aufgabenausführungen automatisch anhalten¶
Task-Graphen können optional nach einer bestimmten Anzahl von aufeinanderfolgenden Aufgabenausführungen, die entweder fehlschlagen oder ein Zeitlimit überschreiten, automatisch angehalten werden.
Legen Sie den Parameter SUSPEND_TASK_AFTER_NUM_FAILURES = num
für die Stammaufgabe eines Task-Graphen fest. Wenn der Parameter auf einen Wert größer 0
gesetzt wird, wird die Stammaufgabe automatisch angehalten, sobald die Ausführung einer beliebigen untergeordneten Aufgabe im Task-Graphen fortlaufend fehlschlägt oder wenn die angegebene Anzahl von aufeinanderfolgenden Ausführungen überschritten ist. Die untergeordnete Aufgabe, die fehlschlägt oder eine Zeitüberschreitung verursacht, wird nicht angehalten.
Fehlgeschlagene Task-Graph-Ausführungen automatisch wiederholen¶
Gibt die Anzahl der automatischen Wiederholungsversuche für den Task-Graphen an. Wenn ein Task-Graph mit Status FAILED abgeschlossen wird, kann Snowflake die Ausführung des Task-Graphen automatisch ab der letzten fehlgeschlagenen Aufgabe im Task-Graphen erneut versuchen.
Die automatische Wiederholung des Task-Graphen ist standardmäßig deaktiviert. Um dieses Feature zu aktivieren, setzen Sie TASK_AUTO_RETRY_ATTEMPTS
auf einen Wert größer als 0
.
Übergeordnete und untergeordnete Aufgaben trennen¶
Abhängigkeiten zwischen Aufgaben in einem Task-Graphen können durch eine der folgenden Aktionen aufgelöst werden:
Mit ALTER TASK … REMOVE AFTER und ALTER TASK … UNSET FINALIZE kann die Verknüpfung zwischen der Zielaufgabe und den angegebenen übergeordneten Aufgaben oder der abgeschlossenen Stammaufgabe entfernt werden.
DROP TASK und GRANT OWNERSHIP trennen alle Verknüpfungen der Zielaufgabe. Beispiel: Stammaufgabe A hat eine untergeordnete Aufgabe B, und Aufgabe B hat eine untergeordnete Aufgabe C. Wenn Sie Aufgabe B löschen, wird die Verknüpfung zwischen Aufgabe A und Aufgabe B unterbrochen und damit auch die Verknüpfung zwischen Aufgabe B und Aufgabe C.
Wenn eine beliebige Kombination der oben genannten Aktionen die Beziehung zwischen der untergeordneten Aufgabe und allen übergeordneten Aufgaben aufhebt, dann wird die untergeordnete Aufgabe entweder eine eigenständige Aufgabe oder eine Stammaufgabe.
Bemerkung
Wenn Sie die Eigentümerschaft einer Aufgabe an den aktuellen Besitzer übertragen, werden die Abhängigkeitsverknüpfungen möglicherweise nicht getrennt.
Abhängige Aufgaben eines Task-Graphen anzeigen¶
Um die untergeordneten Aufgaben für eine Stammaufgabe anzuzeigen, fragen Sie die Tabellenfunktion TASK_DEPENDENTS ab. Um alle Aufgaben in einem Task-Graphen abzurufen, müssen Sie beim Aufrufen der Funktion die Stammaufgabe angeben.
Sie können auch Snowsight verwenden, um Ihre Task-Graphen zu verwalten und anzuzeigen. Weitere Informationen dazu finden Sie unter Anzeigen von Aufgaben und Aufgabendiagrammen in Snowsight.
Task-Graphen freigeben und bereinigen¶
Eine Finalizer-Aufgabe verarbeitet die Freigabe und Bereinigung der von einem Task-Graphen verwendeten Ressourcen. Die Finalizer-Aufgabe wird garantiert ausgeführt, wenn der Task-Graphen ausgeführt wird, und sie stellt die ordnungsgemäße Bereinigung der Ressourcen und den Abschluss der erforderlichen Schritte in allen Szenarios sicher. Wenn beispielsweise eine Task-Graph-Ausführung Zwischentabellen verwendet, um Daten für die Verarbeitung zu verfolgen, und die Ausführung fehlschlägt, bevor alle Tabellenzeilen verarbeitet wurden, würde die nächste Ausführung auf doppelte Zeilen stoßen und müsste die Daten erneut verarbeiten, was zu einer längeren Ausführungszeit oder einer Verschwendung von Computeressourcen führt. Die Finalizer-Aufgabe kann dieses Problem lösen, indem sie die Zeilen löscht oder die Tabelle falls erforderlich abschneidet.
Die Finalizer-Aufgabe funktioniert wie jede andere Aufgabe in einem Task-Graphen, mit den folgenden Unterschieden:
Eine Finalizer-Aufgabe ist immer mit einer Stammaufgabe (root task) verbunden. Jede Stammaufgabe kann nur eine Finalizer-Aufgabe haben, und eine Finalizer-Aufgabe kann nur mit einer Stammaufgabe verbunden sein.
Eine Finalizer-Aufgabe wird nur geplant, wenn in der aktuellen Task-Graph-Ausführung keine anderen Aufgaben ausgeführt werden oder sich in der Warteschlange befinden und wenn mindestens eine Aufgabe im Task-Graphen mit der Ausführung begonnen hat. Wird ein Task-Graph übersprungen (z. B. die Stammaufgabe wird übersprungen), wird die Finalizer-Aufgabe nicht ausgeführt. Wenn ALLOW_OVERLAPPING_EXECUTION den Wert „true“ hat, verhält sich die Finalizer-Aufgabe wie die anderen Aufgaben und wird auch dann geplant, wenn noch andere Task-Graph-Ausführungen aktiv sind.
Eine Finalizer-Aufgabe kann keine untergeordneten Aufgaben haben. Jeder Befehl, der versucht, die Finalizer-Aufgabe zu einem Vorgänger zu machen, schlägt fehl. Das Erstellen einer Finalizer-Aufgabe muss das Schlüsselwort
FINALIZE
enthalten, das mit den SchlüsselwörternSCHEDULE
undAFTER
nicht kompatibel ist.
Um eine Finalizer-Aufgabe zu erstellen, erstellen Sie eine Aufgabe mit dem Schlüsselwort FINALIZE
, und erstellen Sie dann eine Beziehung zur Stammaufgabe:
CREATE TASK <TASK_NAME> ...
... FINALIZE = <ROOT_TASK_NAME>
Weitere Informationen dazu finden Sie unter CREATE TASK.