Einführung in Aufgaben

Eine Aufgabe kann eine der folgenden Typen von SQL-Code ausführen:

  • Eine einzelne SQL-Anweisung

  • Aufruf einer gespeicherten Prozedur

  • Prozedurale Logik mit Snowflake Scripting

Für kontinuierliche ELT-Workflows können Aufgaben mit Tabellenstreams kombiniert werden, um kürzlich geänderte Tabellenzeilen zu verarbeiten. Streams stellen genau einmal die Semantik bei neuen oder geänderten Daten einer Tabelle sicher.

Aufgaben können auch unabhängig voneinander verwendet werden, um periodische Berichte zu generieren, indem Zeilen in eine Berichtstabelle eingefügt oder zusammengeführt werden oder andere periodische Arbeiten ausgeführt werden.

Unter diesem Thema:

Computeressourcen

Aufgaben benötigen Computeressourcen zur Ausführung von SQL-Code. Für einzelne Aufgaben kann eines der folgenden Computemodelle gewählt werden:

  • Snowflake-verwaltet (d. h. serverloses Computemodell)

  • Benutzerverwaltet (d. h. virtuelles Warehouse)

Serverlose Aufgaben

Das serverlose Computemodell für Aufgaben ermöglicht es Ihnen, sich auf Snowflake-verwaltete Computeressourcen zu verlassen, anstatt auf benutzerverwaltete virtuelle Warehouses. Die Computeressourcen werden von Snowflake je nach Workload automatisch in der Größe angepasst und skaliert. Snowflake bestimmt die ideale Größe der Computeressourcen für eine bestimmte Ausführung auf der Grundlage einer dynamischen Analyse der Statistiken für die letzten Ausführungen derselben Aufgabe. Die maximale Größe einer serverlosen Aufgabenausführung entspricht einem XXLARGE-Warehouse. Mehrere Workloads in Ihrem Konto teilen sich einen gemeinsamen Satz von Computeressourcen.

Die Option zur Aktivierung des serverlosen Computemodells muss angegeben werden, wenn eine Aufgabe erstellt wird. Die CREATE TASK-Syntax ist nahezu identisch mit Aufgaben, die auf benutzerverwalteten virtuellen Warehouses beruhen. Lassen Sie den Parameter WAREHOUSE weg, damit Snowflake die Verwaltung der Computeressourcen für die Aufgabe übernimmt. Beachten Sie, dass die Rolle, die den Befehl CREATE TASK ausführt, über die globale Berechtigung EXECUTE MANAGED TASK verfügen muss. Weitere Informationen zu den Anforderungen an die Zugriffssteuerung von Aufgaben finden Sie unter Aufgabensicherheit.

Die Abrechnung für die Ausführung von serverlosen Aufgaben unterscheidet sich etwas von dem Standardmodell für den Credit-Verbrauch bei Aufgaben, für die Warehouses als Computeressourcen eingesetzt werden. Weitere Informationen dazu finden Sie unter Kosten für Aufgaben.

Bemerkung

Folgende Objekttypen und Funktionen können von serverlosen Aufgaben nicht aufgerufen werden:

  • UDFs (benutzerdefinierte Funktionen), die Java- oder Python-Code enthalten.

  • Gespeicherte Prozeduren, die in Scala geschrieben sind (unter Verwendung von Snowpark) oder die UDFs aufrufen, die Java- oder Python-Code enthalten.

Benutzerverwaltete Aufgaben

Bei Bedarf können Sie alternativ die Computeressourcen für einzelne Aufgaben verwalten, indem Sie bei der Erstellung der Aufgabe ein bestehendes virtuelles Warehouse angeben. Diese Option erfordert, dass Sie ein Warehouse wählen, das für die SQL-Aktionen, die von der Aufgabe ausgeführt werden, angemessen dimensioniert ist.

Auswählen einer Warehouse-Größe

Wenn Sie sich dafür entscheiden, bestehende Warehouses für die Bereitstellung von Computeressourcen für einzelne Aufgaben zu verwenden, empfehlen wir Ihnen, die unter Hinweise zu Warehouses beschriebenen bewährten Verfahren zu befolgen. Wir schlagen vor, dass Sie die durchschnittliche Ausführungszeit einer einzelnen Aufgabe oder eines DAG von Aufgaben anhand eines festgelegten Warehouses analysieren, basierend auf der Warehouse-Größe und dem Clustering sowie der Frage, ob das Warehouse von mehreren Prozessen gemeinsam genutzt wird oder nur für die Ausführung dieser einen Aufgabe (oder dieses DAG) vorgesehen ist.

Fragen Sie die Account Usage-Ansicht TASK_HISTORY ab (in der freigegebenen SNOWFLAKE-Datenbank). Die durchschnittliche Differenz zwischen der geplanten und der tatsächlichen Ausführungszeit einer Aufgabe ist die erwartete durchschnittliche Ausführungszeit der Aufgabe, die auch die Wartezeit der Aufgabe in der Warteschlange einschließt. Eine Aufgabe wird in die Warteschlange gestellt, wenn im Moment alle Computeressourcen im Warehouse von anderen Prozessen verwendet werden.

Sofern die für die Aufgaben definierten SQL-Anweisungen nicht optimiert werden können (entweder durch Umschreiben der Anweisungen oder mithilfe gespeicherter Prozeduren), ist dies die erwartete durchschnittliche Ausführungszeit für die Aufgabe (oder den DAG). Wählen Sie anhand Ihrer Analyse die passende Größe für das Warehouse aus, um sicherzustellen, dass die Aufgabe (oder der DAG) in diesem Fenster ausgeführt wird.

Die folgende Abbildung zeigt ein Fenster von 1 Minute, in der eine einzelne Aufgabe 20 Sekunden lang in der Warteschlange steht und dann 40 Sekunden lang ausgeführt wird.

Example task batch window

Die folgende Abbildung zeigt einen DAG, für dessen Ausführung durchschnittlich 5 Minuten erforderlich sind. Die Abbildung zeigt das Fenster für 2 Ausführungen des zu bearbeitenden DAG. Die Berechnung dieses Fensters beginnt beim geplanten Startzeitpunkt der Stammaufgabe und endet, wenn die letzte untergeordnete Aufgabe im DAG vollständig ausgeführt wurde. In diesem Beispiel wird der DAG für andere gleichzeitige Operationen freigegeben, die sich in der Warteschlange befinden, während jede der 3 Aufgaben im DAG ausgeführt wird. Diese parallelen Operationen verbrauchen alle verfügbaren Ressourcen, wenn die Ausführung jeder Aufgabe im DAG beendet ist und bevor die nächste Aufgabe ausgeführt wird. Infolgedessen enthält das Fenster für jede Aufgabe etwas Warteschlangenzeit für das Warten darauf, das andere Operationen abgeschlossen und die Computeressourcen freigegeben werden.

Beachten Sie, dass selbst bei Ausführung dieses DAG in einem dedizierten Warehouse eine kurze Verzögerung zwischen dem Ende der Ausführung einer Vorgängeraufgabe und dem Start einer untergeordneten Aufgabe auftritt. Allerdings wäre kein Warten in der Warteschlange für Ressourcen erforderlich, die gemeinsam mit anderen Operationen genutzt werden. Die von Ihnen gewählte Warehouse-Größe muss groß genug sein, um mehrere untergeordnete Aufgaben zu bedienen, die gleichzeitig von Vorgängeraufgaben ausgelöst werden.

Example DAG batch window

Empfehlungen zur Auswahl des Computemodells

In der folgenden Tabelle werden verschiedene Faktoren beschrieben, die Ihnen bei der Entscheidung helfen können, ob Sie serverlose Aufgaben oder benutzerverwaltete Aufgaben verwenden sollten:

Kategorie

Serverlose Aufgaben

Benutzerverwaltete Aufgaben

Anmerkungen

Anzahl, Dauer und Vorhersagbarkeit des Workloads von parallelen Aufgaben

Empfohlen, wenn Sie ein Warehouse nicht voll auslasten können, weil zu wenige Aufgaben gleichzeitig ausgeführt werden oder diese zu schnell abgeschlossen sind (in weniger als 1 Minute).

Da die Größe der ausgewählten Computeressourcen auf dem Verlauf früherer Ausführungen basiert, sind Aufgaben mit relativ stabilen Ausführungen gute Kandidaten für serverlose Aufgaben.

Empfehlenswert, wenn Sie ein einzelnes Warehouse vollständig auslasten können, indem Sie die Ausführung mehrerer paralleler Aufgaben planen, um die verfügbaren Computeressourcen auszunutzen.

Ebenfalls empfohlen für sporadische oder unvorhersehbare Workloads auf den Computeressourcen. Multi-Cluster-Warehouses mit automatischem Anhalten und automatischem Fortsetzen können helfen, den Credit-Verbrauch zu reduzieren.

Bei serverlosen Aufgaben rechnet Snowflake Ihr Konto auf der Grundlage der tatsächlichen Nutzung der Computeressourcen ab.

Im Gegensatz dazu erfolgt die Abrechnung der benutzerverwalteten Warehouses auf Basis der Warehouse-Größe, wobei bei jedem Fortsetzen des Warehouses mindestens 60 Sekunden abgerechnet werden, unabhängig von den verwendeten Computeressourcen.

Zeitplanintervall

Empfohlen, wenn die Einhaltung des Zeitplanintervalls besonders wichtig ist.

Wenn die Ausführung einer eigenständigen Aufgabe oder eines geplanten DAG fast das gesamte Intervall überschreitet, erhöht Snowflake die Größe der Computeressourcen (bis maximal zum Äquivalent eines 2X-Large-Warehouses).

Empfohlen, wenn die Einhaltung des Zeitintervalls weniger wichtig ist.

Planungsintervall bezieht sich auf das Zeitplanintervall zwischen aufeinanderfolgenden geplanten Ausführungen einer eigenständigen Aufgabe oder der Stammaufgabe eines DAG.

Beachten Sie, dass die Erhöhung der Computeressourcen die Ausführungszeit einiger, aber nicht aller SQL-Codes reduziert und möglicherweise nicht ausreicht, um sicherzustellen, dass eine Aufgabenausführung innerhalb des Batch-Fensters abgeschlossen wird.

Beachten Sie, dass die maximale Größe einer serverlosen Aufgabenausführung einem XXLARGE-Warehouse entspricht. Wenn der Workload einer Aufgabe ein größeres Warehouse erfordert, erstellen Sie eine benutzerverwaltete Aufgabe, die auf ein Warehouse der erforderlichen Größe verweist.

Aufgabenplanung

Eine eigenständige Aufgabe oder eine Stammaufgabe in einem DAG wird im Allgemeinen nach einem Zeitplan ausgeführt. Sie können den Zeitplan beim Erstellen einer Aufgabe (mit CREATE TASK) oder später (mit ALTER TASK) festlegen.

Snowflake stellt sicher, dass zu einem bestimmten Zeitpunkt immer nur eine Instanz einer Aufgabe mit einem Zeitplan (d. h. eine eigenständige Aufgabe oder die Stammaufgabe in einem DAG) ausgeführt wird. Wenn eine Aufgabe zum Zeitpunkt der nächsten geplanten Ausführung noch immer ausgeführt wird, wird diese geplante Zeit übersprungen.

Snowflake passt die Größe und Skalierung der Computeressourcen für serverlose Aufgaben automatisch an. Für Aufgaben, die auf ein Warehouse angewiesen sind, um Computeressourcen bereitzustellen, wählen Sie die geeignete Warehouse-Größe für eine bestimmte Aufgabe aus, um deren Workload innerhalb des festgelegten Zeitplans zu erledigen. Weitere Informationen dazu finden Sie unter Auswählen einer Warehouse-Größe (unter diesem Thema).

Aufgabenplanung und Sommerzeit

Der Cron-Ausdruck in einer Aufgabendefinition unterstützt die Angabe einer Zeitzone. Eine geplante Aufgabe wird gemäß dem angegebenen Cron-Ausdruck in der Ortszeit für eine bestimmte Zeitzone ausgeführt. Bei der Planung von Aufgaben für Zeitzonen, die die Sommerzeit berücksichtigen, ist besondere Vorsicht geboten. Aufgaben, die zu bestimmten Zeiten an Tagen geplant sind, an denen der Übergang von der Standardzeit zur Sommerzeit (oder umgekehrt) erfolgt, können ein unerwartetes Verhalten aufweisen.

Beispiel:

  • Beim Wechsel von der Sommerzeit zur Standardzeit im Herbst wird eine Aufgabe, die um 1 AM in der Zeitzone Amerika/Los Angeles (d. h. 0 1 * * * America/Los_Angeles) beginnen soll, zweimal ausgeführt: einmal um 1 AM und noch einmal, wenn 1:59:59 AM auf 1:00:00 AM Ortszeit wechselt. Das heißt, es gibt zwei Zeitpunkte, an denen die Ortszeit 1 AM ist.

  • Beim Wechsel von der Standardzeit zur Sommerzeit im Frühling wird eine Aufgabe, die um 2 AM in der Zeitzone Amerika/Los Angeles (d. h. 0 2 * * * America/Los_Angeles) beginnen soll, überhaupt nicht ausgeführt, da die lokale Zeit von 1:59:59 AM auf 3:00:00 AM wechselt. Das heißt, es gibt an diesem Tag keinen Zeitpunkt, an dem die Ortszeit 2 AM ist.

Um unerwartete Aufgabenausführungen aufgrund der Sommerzeit zu vermeiden, verwenden Sie eine der folgenden Optionen:

  • Planen Sie keine Aufgabenaussführungen zu einem bestimmten Zeitpunkt zwischen 13:00 und 15:00 Uhr (täglich oder an Wochentagen, zu denen auch Sonntage gehören).

  • Passen Sie den Cron-Ausdruck für Aufgaben, die während dieser Zeiten zweimal im Jahr geplant sind, manuell an, um die Zeitverschiebung wegen der Sommerzeit auszugleichen.

  • Verwenden Sie ein Zeitformat, das keine Sommerzeit anwendet, z. B. UTC.

DAG von Aufgaben

Ein Directed Acyclic Graph (DAG) ist ein gerichteter azyklischer Task-Graph, der aus einer Reihe von Aufgaben besteht, die aus einer einzigen Stammaufgabe und zusätzlichen Aufgaben besteht, die nach ihren Abhängigkeiten organisiert sind. DAGs 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 (d. h. eine Schleife). Jede Aufgabe (außer der Stammaufgabe) kann mehrere Vorgängeraufgaben (Abhängigkeiten) haben, und jede Aufgabe kann mehrere nachfolgende (untergeordnete) Aufgaben haben, die von ihr abhängen. Eine Aufgabe wird erst dann ausgeführt, wenn die Ausführung aller zugehörigen Vorgängeraufgaben erfolgreich abgeschlossen wurde.

Die Stammaufgabe sollte einen definierten Zeitplan haben, der die Ausführung des DAG auslöst. Jede der anderen Aufgaben hat mindestens einen definierten Vorgänger, um die Aufgaben in DAG zu verknüpfen. Eine untergeordnete Aufgabe wird erst ausgeführt, wenn alle ihre Vorgängeraufgaben erfolgreich abgeschlossen wurden.

Sie können die Vorgängeraufgaben beim Erstellen einer neue Aufgabe (mit CREATE TASK … AFTER) oder später (mit ALTER TASK … ADD AFTER) angeben. Ein DAG ist auf maximal 1.000 Aufgaben insgesamt (einschließlich der Stammaufgabe) beschränkt. Eine einzelne Aufgabe kann maximal 100 Vorgängeraufgaben und 100 untergeordnete Aufgaben haben.

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.

Basic DAG example

Das folgende praktische Beispiel zeigt, wie ein DAG zur Aktualisierung von Dimensionstabellen in einer Verkaufsdatenbank vor der Aggregation von Faktendaten verwendet werden kann:

Sales database DAG example

Ein weiteres Beispiel zeigt, wie die abschließende Aufgabe in einem DAG eine externe Funktion aufruft, um einen externen Messagingdienst zu veranlassen, eine Benachrichtigung zu senden, dass alle vorherigen Aufgaben erfolgreich abgeschlossen wurden.

Cloud messaging notification DAG example

Eigentümerschaft der Aufgabe

Alle Aufgaben eines einfachen DAG müssen denselben Aufgabeneigentümer haben (d. h. genau eine Rolle muss über die Berechtigung OWNERSHIP für alle Aufgaben verfügen) und in derselben Datenbank und in demselben Schema gespeichert sein.

Durch das Übertragen der Eigentümerschaft an einer Aufgabe wird die Abhängigkeit zwischen dieser Aufgabe und allen Vorgängeraufgaben und untergeordneten Aufgaben aufgehoben. Weitere Informationen dazu finden Sie unter Verknüpfung zwischen Vorgänger- und untergeordneten Aufgaben auflösen (in diesem Thema).

Wenn die Eigentümerschaft aller Aufgaben in einem DAG durch eine der folgenden Aktivitäten gleichzeitig übertragen wird, bleiben die Beziehungen zwischen allen Aufgaben im DAG erhalten:

  • Der aktuelle Eigentümer aller Aufgaben, die den DAG umfassen, wird gelöscht (mit DROP ROLE). Die Eigentümerschaft an allen Objekten, die der gelöschten Rolle gehören, wird auf die Rolle übertragen, die den Befehl DROP ROLE ausführt.

  • Die Eigentümerschaft aller Aufgaben, aus denen sich der DAG zusammensetzt, wird explizit auf eine andere Rolle übertragen (z. B. durch Ausführen von GRANT OWNERSHIP für alle Aufgaben in einem Schema).

DAG mit überlappenden Aufgabenausführungen

Snowflake stellt standardmäßig sicher, dass jeweils nur eine Instanz eines bestimmten DAG ausgeführt wird. Die nächste Ausführung einer Stammaufgabe wird erst geplant, wenn die Ausführung aller Aufgaben im DAG beendet wurde. Das heißt, wenn die kumulierte Zeit, die für die Ausführung aller Aufgaben im DAG benötigt wird, die in der Definition der Stammaufgabe festgelegte explizit geplante Zeit überschreitet, wird mindestens eine Ausführung des DAG ü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 DAG-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 der Ausführungsstart eines DAG so geplant, dass erst eine vorherige Ausführung 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 Snowflake-verwalteten Computeressource keine Wartezeit gibt:

Overlapping DAG runs

Überlappende Ausführungen können toleriert werden (oder sind sogar erwünscht), wenn SQL-Lese-/Schreiboperationen, die durch überlappende Ausführungen eines DAG ausgeführt werden, keine falschen oder duplizierten Daten erzeugen. Für andere DAGs sollten Aufgabeneigentümer (d. h. die Rolle mit OWNERSHIP-Berechtigung für alle Aufgaben im DAG) einen geeigneten Zeitplan für die Stammaufgabe festlegen und eine geeignete Warehouse-Größe auswählen (oder Snowflake-verwaltete Computeressourcen verwenden), um sicherzustellen, dass eine Instanz des DAG bis zum Ende ausgeführt wird, bevor die Stammaufgabe das nächste Mal geplant wird.

So stimmen Sie einen DAG besser mit dem in der Stammaufgabe definierten Zeitplan ab:

  1. Erhöhen Sie, falls möglich, die Planungszeit zwischen den Ausführungen der Stammaufgabe.

  2. Erwägen Sie, rechenintensive Aufgaben so zu ändern, dass sie von Snowflake verwaltete Computeressourcen nutzen. Wenn die Aufgabe auf benutzerverwaltete Computeressourcen angewiesen ist, sollten Sie die Größe des Warehouses erhöhen, das große oder komplexe SQL-Anweisungen oder gespeicherte Prozeduren im DAG ausführt.

  3. 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 DAG 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).

Anzeigen abhängiger Aufgaben in einem DAG

So zeigen Sie die direkten untergeordneten Aufgaben einer Stammaufgabe oder alle Aufgaben in einem DAG an:

SQL

Fragen Sie die Tabellenfunktion TASK_DEPENDENTS ab (im Snowflake Information Schema). Um alle Aufgaben in einem DAG abzurufen, müssen Sie beim Aufruf der Funktion die Stammaufgabe eingeben. Wenn Sie eine untergeordnete Aufgabe eingeben, gibt die Funktion die untergeordneten Aufgaben (und die untergeordneten Aufgaben dieser untergeordneten Aufgaben usw.) der angegebenen Aufgabe zurück.

DAG-Ausführungen mit angehaltenen untergeordneten Aufgaben

Wenn die Stammaufgabe angehalten wurde, können Sie alle untergeordneten Aufgaben mit ALTER TASK … RESUME | SUSPEND fortsetzen oder anhalten. Es ist nicht erforderlich, angehaltene untergeordnete Aufgaben fortzusetzen, bevor Sie die Stammaufgabe fortsetzen.

Wenn ein DAG 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.

Fortsetzen angehaltener Aufgaben in einem DAG

Um alle Aufgaben in einem DAG rekursiv fortzusetzen, fragen Sie die Funktion SYSTEM$TASK_DEPENDENTS_ENABLE ab, anstatt jede Aufgabe einzeln fortzusetzen (mit ALTER TASK … RESUME).

Finalizer-Aufgabe

Eine Finalizer-Aufgabe verarbeitet das Release und nimmt eine Bereinigung der von einem DAG verwendeten Ressourcen vor. Die Finalizer-Aufgabe wird garantiert ausgeführt, wenn der DAG 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 DAG-Ausführung Zwischentabellen verwendet, um Daten für die Verarbeitung zu verfolgen, und die Ausführung dann 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 DAG, 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 DAG-Ausführung keine anderen Aufgaben ausgeführt werden oder sich in der Warteschlange befinden und wenn mindestens eine Aufgabe im Task-Graph 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 DAG-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örtern SCHEDULE und AFTER 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>
Copy

Weitere Informationen dazu finden Sie unter CREATE TASK.

Bemerkung

In Snowsight wird eine Finalizer-Aufgabe als separate Aufgabe mit eigenem Ausführungsverlauf und eigenen Konfigurationsdetails angezeigt. In einer Task-Graph-Ansicht wird die Finalizer-Aufgabe oder die Beziehung zwischen der Stammaufgabe und der Finalizer-Aufgabe nicht angezeigt.

Versionierung von Ausführungen

Wenn eine eigenständige Aufgabe oder die Stammaufgabe in einem DAG zum ersten Mal fortgesetzt (oder manuell mit EXECUTE TASK ausgeführt) wird, wird eine Startversion der Aufgabe festgelegt. Wenn die Aufgabe eine Stammaufgabe ist, dann wird eine Version des gesamten DAG festgelegt, einschließlich aller Eigenschaften für alle Aufgaben im DAG. Die eigenständige Aufgabe oder der DAG werden mit dieser Version ausgeführt. Nachdem eine Aufgabe angehalten und geändert wurde, wird beim Fortsetzen oder manuellen Ausführen der eigenständigen Aufgabe bzw. der Stammaufgabe eine neue Version festgelegt.

Um eine beliebige Aufgabe in einem DAG zu ändern oder neu zu erstellen, muss die Stammaufgabe zunächst angehalten werden (mit ALTER TASK … SUSPEND). Wenn die Stammaufgabe angehalten wird, werden alle zukünftigen geplanten Ausführungen der Stammaufgabe abgebrochen. Wenn sich Aufgaben jedoch gerade in Ausführung befinden (d. h. die Aufgaben haben den Status EXECUTING), 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 DAG ä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 DAG wird angehalten, aber eine geplante Ausführung dieser Aufgabe hat bereits begonnen. Der Eigentümer des DAG ä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 DAG 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 DAG 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.

Festlegen von Sitzungsparametern für Aufgaben

Sie können Sitzungsparameter für die Sitzung festlegen, in der eine Aufgabe ausgeführt wird. Ändern Sie dazu eine vorhandene Aufgabe, und legen Sie die gewünschten Parameterwerte fest (mit ALTER TASKSET session_parameter = value[, session_parameter = value ... ]).

Eine Aufgabe unterstützt alle Sitzungsparameter. Die vollständige Liste finden Sie unter Parameter.

Beachten Sie, dass eine Aufgabe keine Konto- oder Benutzerparameter unterstützt.

Aufgaben nach fehlgeschlagenen Ausführungen automatisch anhalten

Aufgaben können optional nach einer bestimmten Anzahl von aufeinanderfolgenden Ausführungen, die entweder fehlschlagen oder ein Zeitlimit überschreiten, automatisch angehalten werden. Dieses Feature sorgt für eine Senkung der Kosten, indem Aufgaben angehalten werden, die Snowflake-Credits verbrauchen, aber nicht zu Ende ausgeführt wurden. Zu den fehlgeschlagenen Aufgabenausführungen zählen solche, bei denen der SQL-Code im Textteil der Aufgabe entweder zu einem Benutzerfehler oder zu einem Timeout führt. Aufgabenausführungen, die übersprungen oder abgebrochen werden oder aufgrund eines Systemfehlers fehlschlagen, gelten als „unbestimmt“ und werden bei der Zählung der fehlgeschlagenen Aufgabenausführungen nicht berücksichtigt.

Legen Sie für den SUSPEND_TASK_AFTER_NUM_FAILURES = num-Parameter eine eigenständige Aufgabe oder die Stammaufgabe eines DAG fest. Wenn der Parameter auf einen Wert größer als 0 gesetzt wird, gilt für Ausführungen der eigenständigen Aufgabe bzw. des DAG das folgende Verhalten:

  • Eigenständige Aufgaben werden automatisch angehalten, wenn die angegebene Anzahl aufeinanderfolgender Aufgabenausführungen entweder fehlschlägt oder eine Zeitüberschreitung verursacht.

  • Die Stammaufgabe wird automatisch angehalten, wenn die Ausführung einer beliebigen Einzelaufgabe im DAG fehlgeschlagen ist oder wenn die angegebene Anzahl von aufeinanderfolgenden Ausführungen überschritten ist.

Der Parameter kann beim Erstellen einer Aufgabe festgelegt werden (mit CREATE TASK) oder später (mit ALTER TASK). Die Einstellung gilt für Aufgaben, die entweder auf von Snowflake verwaltete Computeressourcen (d. h. ein serverloses Computemodell) oder auf vom Benutzer verwaltete Computeressourcen (d. h. ein virtuelles Warehouse) angewiesen sind.

Der Parameter SUSPEND_TASK_AFTER_NUM_FAILURES kann auch auf Konto-, Datenbank- und Schemaebene festgelegt werden. Die Einstellung gilt für alle im geänderten Objekt enthaltenen eigenständigen oder Stammaufgaben. Beachten Sie, dass die explizite Einstellung des Parameters auf einer niedrigeren (d. h. detaillierteren) Ebene den auf einer höheren Ebene eingestellten Parameterwert überschreibt.

Manuelles Ausführen von Aufgaben

Mit dem Befehl EXECUTE TASK wird manuell eine asynchrone Einzelausführung einer geplanten Aufgabe (entweder eine eigenständige Aufgabe oder die Stammaufgabe in einem DAG) ausgeführt, 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 DAG aus, sobald deren vorhergehende Aufgabe abgeschlossen ist, so als ob die Stammaufgabe nach ihrem definierten Zeitplan ausgeführt worden wäre.

Dieser SQL-Befehl ist nützlich, um neue oder geänderte eigenständige Aufgaben bzw. DAGs zu testen, bevor diese für die Ausführung von SQL-Code in der Produktion aktiviert werden.

Rufen Sie diesen SQL-Befehl direkt in Skripten oder gespeicherten Prozeduren auf. Darüber hinaus unterstützt dieser Befehl die Integration von Aufgaben in externe Datenpipelines. Alle Drittanbieterdienste, die sich bei Ihrem Snowflake-Konto authentifizieren und SQL-Aktionen autorisieren können, können mit dem Befehl EXECUTE TASK Aufgaben starten.

Anzeigen des Aufgabenverlaufs für Ihr Konto

Sie können den Aufgabenverlauf für Ihr Konto mit SQL oder in Snowsight anzeigen. Weitere Informationen zum Anzeigen des Aufgabenverlaufs in Snowsight finden Sie unter Anzeigen des Aufgabenverlaufs in Snowsight.

Die folgenden Rollen (oder Rollen mit den angegebenen Berechtigungen) können SQL verwenden, um den Aufgabenverlauf innerhalb eines angegebenen Datumsbereichs anzuzeigen:

  • Kontoadministratoren (d. h. Benutzer mit der Rolle ACCOUNTADMIN)

  • Aufgabeneigentümer (d. h. Rolle mit der Berechtigung OWNERSHIP für eine Aufgabe)

  • Jede Rolle mit der globalen Berechtigung MONITOR EXECUTION

So zeigen Sie den Ausführungsverlauf für eine einzelne Aufgabe an:

SQL

Fragen Sie die Tabellenfunktion TASK_HISTORY ab (im Snowflake Information Schema).

So zeigen Sie Details zu einer DAG-Ausführung an, die gerade geplant ist oder ausgeführt wird:

SQL

Fragen Sie die Tabellenfunktion CURRENT_TASK_GRAPHS ab (im Snowflake Information Schema).

So zeigen Sie den Verlauf der DAG-Ausführungen an, die in den letzten 60 Minuten erfolgreich abgeschlossen wurden, fehlgeschlagen sind oder abgebrochen wurden:

SQL

Fragen Sie die Tabellenfunktion COMPLETE_TASK_GRAPHS ab (im Snowflake Information Schema).

Fragen Sie die Ansicht Ansicht COMPLETE_TASK_GRAPHS ab (in Account Usage).

Kosten für Aufgaben

Die Kosten, die mit der Ausführung einer Aufgabe zur Ausführung von SQL-Code verbunden sind, hängen von der Quelle der Computeressourcen für die Aufgabe ab:

Benutzerverwaltete Warehouses

Snowflake stellt Ihrem Konto die Credit-Nutzung auf der Grundlage der Warehouse-Nutzung während der Ausführung einer Aufgabe in Rechnung, ähnlich wie die Warehouse-Nutzung für die Ausführung derselben SQL-Anweisungen in einem Client oder der Snowflake-Weboberfläche. Die sekundengenaue Credit-Abrechnung und das automatische Anhalten des Warehouses sorgen für die notwendige Flexibilität, um mit größeren Warehouse-Größen zu beginnen und die Größe dann an Ihre Aufgaben-Workloads anzupassen.

Snowflake-verwaltete Ressourcen (d. h. serverloses Computemodell)

Im Gegensatz zu kundenverwalteten virtuellen Warehouses, die bereits bei Aktivierung Credits verbrauchen und auch ungenutzt bleiben oder überlastet sein können, rechnet Snowflake Ihr Konto auf der Grundlage ihrer tatsächlichen Nutzung von Computeressourcen ab. Die Gebühren werden auf Basis der Gesamtnutzung der Ressourcen (einschließlich der Clouddienstnutzung) berechnet und in Computestunden (Compute-Hours) der Credit-Nutzung gemessen.

Snowflake analysiert die Aufgabenausführungen im Aufgabenverlauf dynamisch, um die ideale Größe der Computeressourcen zu ermitteln, und hält diese Computeressourcen an, um Kosten zu sparen. Snowflake verwaltet die Auslastung und sorgt so dafür, dass optimale Computeressourcen zur Deckung des Bedarfs bereitstehen. Um die Verwaltungskosten der von Snowflake bereitgestellten Computeressourcen zu decken, wenden wir einen 1,5-fachen Multiplikator auf den Ressourcenverbrauch an. Es ist jedoch zu beachten, dass das serverlose Computemodell die Berechnungskosten im Vergleich zu benutzerverwalteten Warehouses immer noch senken könnte, in einigen Fällen sogar erheblich.

Weitere Informationen zur Anzahl der von Aufgaben verbrauchten Credits finden Sie in der „Serverless Feature Credit Table“ unter Snowflake Service Consumption Table.

Die Abrechnung ähnelt anderen Snowflake-Features wie Automatic Clustering von Tabellen, Replikation und Failover/Failback sowie Snowpipe.

Um die aktuelle Credit-Nutzung einer bestimmten Aufgabe abzurufen, fragen Sie die Tabellenfunktion SERVERLESS_TASK_HISTORY ab. Führen Sie die folgende Anweisung als Aufgabeneigentümer aus (d. h. mit der Rolle, die über OWNERSHIP-Berechtigung für die Aufgabe verfügt):

SET num_credits = (SELECT SUM(credits_used)
  FROM TABLE(<database_name>.information_schema.serverless_task_history(
    date_range_start=>dateadd(D, -1, current_timestamp()),
    date_range_end=>dateadd(D, 1, current_timestamp()),
    task_name => '<task_name>')
    )
  );
Copy

Wobei:

<Datenbankname>

Name der Datenbank, die die Aufgabe enthält.

<Aufgabenname>

Name der Aufgabe.

Um die aktuelle Credit-Nutzung aller serverlosen Aufgaben abzurufen, fragen Sie die Tabellenfunktion SERVERLESS_TASK_HISTORY ab. Führen Sie die folgenden Anweisungen als Kontoadministrator (d. h. als Benutzer mit der Rolle ACCOUNTADMIN) aus:

SELECT start_time,
  end_time,
  task_id,
  task_name,
  credits_used,
  schema_id,
  schema_name,
  database_id,
  database_name
FROM snowflake.account_usage.serverless_task_history
ORDER BY start_time, task_id;
Copy

Grundlegendes zum Systemdienst

Snowflake führt Aufgaben mit den Berechtigungen des Aufgabeneigentümer aus (d. h. der Rolle, die die Berechtigung OWNERSHIP für die Aufgabe besitzt), die Aufgabenausführung ist jedoch keinem Benutzer zugeordnet. Stattdessen wird jede Ausführung von einem Systemdienst ausgeführt. Aufgaben werden von bestimmten Benutzern entkoppelt, um Komplikationen zu vermeiden, die auftreten können, wenn Benutzer gelöscht oder aufgrund von Authentifizierungsproblemen gesperrt werden oder wenn Rollen entfernt werden.

Aufgaben werden mit den Berechtigungen des Aufgabeneigentümers ausgeführt, unabhängig davon, ob sie geplant oder manuell von EXECUTE TASK von einer anderen Rolle mit OPERATE-Berechtigung ausgeführt werden.

Da Aufgabenausführungen von einem Benutzer entkoppelt sind, wird der Abfrageverlauf von Aufgabenausführungen dem Systemdienst zugeordnet. SYSTEM ist kein Benutzer im Konto, sondern ein Hintergrunddienst. Daher gibt es keine Benutzeranmeldeinformationen für diesen Dienst, und keine Person (von Snowflake oder in Ihrem Konto) kann seine Identität übernehmen. Die Aktivität für den Systemdienst ist auf Ihr Konto beschränkt. Der Dienst bietet dieselben Verschlüsselungsschutz- und weitere Sicherheitsprotokolle, wie sie auch für andere Operationen erzwungen werden.

Aufgaben-DDL

Um das Erstellen und Verwalten von Aufgaben zu unterstützen, bietet Snowflake den folgenden Satz von speziellen DDL-Befehlen:

Darüber hinaus können Anbieter den Zugriff auf die für ELT erforderlichen Datenbankobjekte mit der folgenden DDL-Standardzugriffssteuerung anzeigen, gewähren oder widerrufen:

Aufgabenfunktionen

Um das Abrufen von Informationen über Aufgaben zu unterstützen, bietet Snowflake die folgenden SQL-Funktionen:

Aufgabensicherheit

Zugriffssteuerungsrechte

Erstellen von Aufgaben

Für das Erstellen von Aufgaben ist eine Rolle mit mindestens den folgenden Berechtigungen erforderlich:

Objekt

Berechtigung

Anmerkungen

Konto

EXECUTE MANAGED TASK

Nur für Aufgaben erforderlich, die auf Snowflake-verwaltete Computeressourcen (serverloses Computemodell) angewiesen sind.

Datenbank

USAGE

Schema

USAGE, CREATE TASK

Warehouse

USAGE

Nur für Aufgaben erforderlich, die auf benutzerverwaltete Warehouses für Computeressourcen angewiesen sind.

Eigene Aufgaben

Nachdem eine Aufgabe erstellt wurde, muss der Aufgabeneigentümer (d. h. die Rolle mit der Berechtigung OWNERSHIP für die Aufgabe) über die folgenden Berechtigungen verfügen:

Objekt

Berechtigung

Anmerkungen

Konto

EXECUTE TASK

Erforderlich, um jegliche Aufgaben auszuführen, die der Rolle gehören. Durch das Widerrufen der Berechtigung EXECUTE TASK für eine Rolle wird verhindert, dass alle nachfolgenden Aufgaben unter dieser Rolle gestartet werden.

Konto

EXECUTE MANAGED TASK

Nur für Aufgaben erforderlich, die auf Snowflake-verwaltete Computeressourcen angewiesen sind.

Datenbank

USAGE

Schema

USAGE

Aufgabe

OWNERSHIP

Warehouse

USAGE

Darüber hinaus muss die Rolle über die erforderlichen Berechtigungen verfügen, um die von der Aufgabe ausgeführte SQL-Anweisung auszuführen.

Anhalten und Fortsetzen von Aufgaben

Zusätzlich zum Aufgabeneigentümer kann eine Rolle mit der Berechtigung OPERATE für die Aufgabe, die Aufgabe anhalten und fortsetzen. Diese Rolle muss die Berechtigung USAGE für die Datenbank und das Schema haben, die die Aufgabe enthalten. Es sind keine weiteren Berechtigungen erforderlich.

Wenn eine Aufgabe fortgesetzt wird, überprüft Snowflake, ob die Rolle des Aufgabeneigentümers die unter Eigene Aufgaben (unter diesem Thema) aufgeführten Berechtigungen aufweist.

Erstellen einer Aufgabenadministratorrolle

Zur Vereinfachung der Verwendung empfehlen wir das Erstellen einer kundenspezifischen Rolle (z. B. taskadmin) und das Zuweisen der Berechtigung EXECUTE TASK zu dieser Rolle. Jede Rolle, die Berechtigungen erteilen kann (z. B. SECURITYADMIN oder jede Rolle mit der Berechtigung MANAGE GRANTS) kann diese kundenspezifische Rolle dann jeder Aufgabeneigentümerrolle zuweisen, um eine Änderung ihrer eigenen Aufgaben zu ermöglichen. Um zu verhindern, dass die Aufgabeneigentümerrolle die Aufgabe ausführt, muss der Aufgabeneigentümerrolle nur diese kundenspezifische Rolle entzogen werden. Beachten Sie, dass ein Kontoadministrator die Berechtigung EXECUTE TASK für die Rolle des Aufgabeneigentümers widerrufen muss, wenn Sie diese kundenspezifische Rolle nicht erstellen möchten.

Erstellen Sie beispielsweise eine kundenspezifische Rolle mit dem Namen taskadmin, und erteilen Sie dieser Rolle die Berechtigung EXECUTE TASK. Weisen Sie die Rolle taskadmin einer Aufgabeneigentümerrolle mit dem Namen myrole zu:

USE ROLE securityadmin;

CREATE ROLE taskadmin;

-- set the active role to ACCOUNTADMIN before granting the account-level privileges to the new role
USE ROLE accountadmin;

GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;

-- set the active role to SECURITYADMIN to show that this role can grant a role to another role
USE ROLE securityadmin;

GRANT ROLE taskadmin TO ROLE myrole;
Copy

Weitere Informationen zum Erstellen von kundenspezifischen Rollen und Rollenhierarchien finden Sie unter Konfigurieren der Zugriffssteuerung.

Löschen einer Aufgabeneigentümerrolle

Wenn die Eigentümerrolle einer bestimmten Aufgabe (d. h. die Rolle mit der Berechtigung OWNERSHIP für die Aufgabe) gelöscht wird, geht die Eigentümerschaft der Aufgabe wieder an die Rolle zurück, die die Eigentümerrolle gelöscht hat. Dadurch wird sichergestellt, dass die Eigentümerschaft auf eine Rolle übertragen wird, die in der Rollenhierarchie näher an der Stammrolle liegt. Wenn eine Aufgabe wieder in Besitz genommen wird, wird sie automatisch angehalten, d. h. alle Ausführungen, die sich derzeit in Verarbeitung befinden, werden abgeschlossen, während neue Ausführungen erst wieder geplant werden, wenn die Aufgabe vom neuen Eigentümer explizit wieder aufgenommen wird. Dadurch soll verhindert werden, dass ein Benutzer mit Zugriff auf eine bestimmte Rolle Aufgaben zurücklässt, die plötzlich mit höheren Berechtigungen ausgeführt werden, wenn die Rolle entfernt wird.

Wenn die Rolle, unter der eine ausgeführte Aufgabe ausgeführt wird, gelöscht wird, während die Aufgabe ausgeführt wird, schließt die Aufgabe die Verarbeitung unter der gelöschten Rolle ab.

Workflow

Dieser Abschnitt bietet einen allgemeinen Überblick über den Workflow zum Einrichten von Aufgaben.

  1. Führen Sie die Schritte in Erstellen einer Aufgabenadministratorrolle (unter diesem Thema) aus, um eine Rolle zu erstellen, mit der die Befehle in den folgenden Schritten ausgeführt werden können.

  2. Erstellen Sie mit CREATE TASK eine Aufgabe. Die Aufgabe ist standardmäßig angehalten.

    Bemerkung

    Überprüfen Sie, ob die SQL-Anweisung, auf die Sie in einer Aufgabe verweisen, wie erwartet ausgeführt wird, bevor Sie die Aufgabe erstellen. Aufgaben dienen dazu, SQL-Anweisungen oder gespeicherte Prozeduren zu automatisieren, die bereits gründlich getestet wurden.

  3. Führen Sie ALTER TASK … RESUME aus, damit die Aufgabe auf Grundlage der in der Aufgabendefinition angegebenen Parameter ausgeführt werden kann.