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:
Serverloses Computemodell
Benutzerverwaltete virtuelle Warehouses
Serverlose Aufgaben¶
Das serverlose Computemodell für Aufgaben ermöglicht es Ihnen, sich auf Snowflake-verwaltete Computeressourcen zu verlassen, anstatt auf benutzerverwaltete virtuelle Warehouses. Serverlose Computeressourcen werden von Snowflake je nach Workload automatisch in der Größe angepasst und skaliert. Snowflake bestimmt die ideale Größe der serverlosen 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 Computegröße für eine serverlose Aufgabe entspricht einem benutzerverwalteten virtuellen Warehouse der Größe XXLARGE. Mehrere Workloads in Ihrem Konto teilen sich einen gemeinsamen Satz von Computeressourcen.
Um das serverlose Computemodell zu aktivieren, müssen Sie beim Erstellen einer Aufgabe mit CREATE TASK den Parameter WAREHOUSE weglassen. 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 von dem Standardmodell für den Credit-Verbrauch bei Aufgaben, für die virtuelle 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.
Tipp
Serverlose Aufgaben unterstützen die Verwendung von Hybridtabellen, aber möglicherweise stellen Sie fest, dass Leistung oder Effizienz bei Verwendung von Hybridtabellen nicht optimal sind.
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 Task-Graphen für ein bestimmtes Warehouse 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 bzw. dieses Task-Graphen 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 Task-Graphen. Wählen Sie anhand Ihrer Analyse die richtige Größe für das Warehouse aus, um sicherzustellen, dass die Aufgabe oder der Task-Graph innerhalb dieses Zeitfensters 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.
Die folgende Abbildung zeigt einen Task-Graphen, für dessen Ausführung durchschnittlich 5 Minuten erforderlich sind. Die Abbildung zeigt das Fenster für 2 Ausführungen des zu bearbeitenden Task-Graphen. Die Berechnung dieses Fensters beginnt beim geplanten Startzeitpunkt der Stammaufgabe und endet, wenn die letzte untergeordnete Aufgabe im Task-Graphen vollständig ausgeführt wurde. In diesem Beispiel wird der Task-Graph für andere gleichzeitige Operationen freigegeben, die sich in der Warteschlange befinden, während jede der 3 Aufgaben im Task-Graphen ausgeführt wird. Diese parallelen Operationen verbrauchen alle verfügbaren Ressourcen, wenn die Ausführung jeder Aufgabe im Task-Graphen 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 Task-Graphen in einem dedizierten Warehouse eine kurze Verzögerung zwischen dem Ausführungsende einer Vorgängeraufgabe und dem Start einer untergeordneten Aufgabe auftritt. Allerdings tritt kein Warten in der Warteschlange für Ressourcen auf, 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.
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 Task-Graphen 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 Task-Graphen. 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 Task-Graphen 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 Task-Graphen) 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.
Task-Graphen¶
Ein Task-Graph, oder auch Directed Acyclic Graph (DAG) genannt, besteht aus einer Reihe von Aufgaben, 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. Mit Ausnahme der Stammaufgabe kann jede Aufgabe mehrere Vorgängeraufgaben (Abhängigkeiten) haben. Jede Aufgabe kann auch 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 Task-Graphen auslöst. Jede der anderen Aufgaben hat mindestens einen definierten Vorgänger, um die Aufgaben im Task-Graphen 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 Task-Graph 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.
Sie können Ihren Task-Graphen mit SQL oder über Snowsight anzeigen. Informationen zum Anzeigen von Task-Graphen in Snowsight finden Sie unter Anzeigen einzelner Task-Graphen.
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:
Ein weiteres 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 der Aufgabe¶
Alle Aufgaben eines einfachen Task-Graphen 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 (unter diesem Thema).
Wenn die Eigentümerschaft aller Aufgaben in einem Task-Graphen durch eine der folgenden Aktivitäten gleichzeitig übertragen wird, bleiben die Beziehungen zwischen allen Aufgaben im Task-Graphen erhalten:
Der aktuelle Eigentümer aller Aufgaben, die den Task-Graphen 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 Task-Graph zusammensetzt, wird explizit auf eine andere Rolle übertragen (z. B. durch Ausführen von GRANT OWNERSHIP für alle Aufgaben in einem Schema).
Ü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).
Anzeigen abhängiger Aufgaben eines Task-Graphen¶
So zeigen Sie die direkten untergeordneten Aufgaben einer Stammaufgabe oder alle Aufgaben in einem Task-Graphen an:
- SQL:
Fragen Sie die Tabellenfunktion TASK_DEPENDENTS ab (im Snowflake Information Schema). Um alle Aufgaben in einem Task-Graphen abzurufen, müssen Sie beim Aufrufen der Funktion die Stammaufgabe angeben. 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.
Task-Graph-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 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.
Fortsetzen angehaltener Aufgaben in einem Task-Graphen¶
Um alle Aufgaben in einem Task-Graphen rekursiv fortzusetzen, fragen Sie die Funktion SYSTEM$TASK_DEPENDENTS_ENABLE ab, anstatt jede Aufgabe einzeln fortzusetzen (mit ALTER TASK … RESUME).
Verknüpfung zwischen Vorgänger- und untergeordneten Aufgaben auflösen¶
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 Vorgängeraufgaben 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 Vorgängeraufgaben aufhebt, dann wird die bisherige untergeordnete Aufgabe entweder eine eigenständige Aufgabe oder eine Stammaufgabe, je nachdem, ob andere Aufgaben die Aufgabe als ihren Vorgänger identifizieren.
Bemerkung
Wenn Sie die Eigentümerschaft an einer Aufgabe mit GRANT OWNERSHIP
dem aktuellen Eigentümer zuweisen, werden Abhängigkeitsverbindungen möglicherweise nicht getrennt.
Finalizer-Aufgabe¶
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.
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 Task-Graphen 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 Task-Graphen festgelegt, einschließlich aller Eigenschaften für alle Aufgaben im Task-Graphen. Die eigenständige Aufgabe oder die Task-Graph-Ausführungen verwenden diese Version. 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 Task-Graphen zu ändern oder neu zu erstellen, muss zuerst die Stammaufgabe 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 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.
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 TASK … SET 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 den Parameter SUSPEND_TASK_AFTER_NUM_FAILURES = num
für eine eigenständige Aufgabe oder für die Stammaufgabe eines Task-Graphen fest. Wenn der Parameter auf einen Wert größer als 0
gesetzt wird, gilt für Ausführungen der eigenständigen Aufgabe bzw. der Stammaufgabe des Task-Graphen das folgende Verhalten:
Eigenständige Aufgaben werden automatisch angehalten, wenn die angegebene Anzahl aufeinanderfolgender Aufgabenausführungen entweder fehlschlägt oder eine Zeitüberschreitung verursacht.
Eine Stammaufgabe wird automatisch angehalten, wenn 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.
Der Parameter kann beim Erstellen einer Aufgabe festgelegt werden (mit CREATE TASK) oder später (mit ALTER TASK).
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 das explizite Einstellen 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 die Ausführung einer geplanten Aufgabe (entweder einer eigenständige Aufgabe oder der Stammaufgabe im Task-Graphen) ausgelöst, 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.
Dieser SQL-Befehl ist nützlich, um neue oder geänderte eigenständige Aufgaben bzw. Task-Graphen 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 Task-Graph-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 Task-Graph-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.
- 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 serverlosen 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. Damit die Verwaltungskosten für serverlose Computeressourcen abgedeckt werden, wendet Snowflake einen Faktor von 1,2 auf den Ressourcenverbrauch an. Das serverlose Computemodell kann dennoch die Computekosten im Vergleich zu benutzerverwalteten Warehouses senken, 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:
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>') ) );
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 folgende Anweisung als Kontoadministrator 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;
Erläuterungen 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 bei Aufgaben erforderlich, die serverlose Computeressourcen verwenden. |
Datenbank |
USAGE |
|
Schema |
USAGE, CREATE TASK |
|
Warehouse |
USAGE |
Nur für Aufgaben erforderlich, die auf benutzerverwaltete Warehouses für Computeressourcen angewiesen sind. |
Eigentümerschaft von Aufgaben¶
Nachdem eine Aufgabe erstellt wurde, muss der Aufgabeneigentümer über die folgenden Berechtigungen verfügen, um die Aufgabe ausführen zu können:
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 bei Aufgaben erforderlich, die serverlose Computeressourcen verwenden. |
Datenbank |
USAGE |
|
Schema |
USAGE |
|
Aufgabe |
OWNERSHIP |
|
Warehouse |
USAGE |
Nur für Aufgaben erforderlich, die auf benutzerverwaltete Warehouses für Computeressourcen angewiesen sind. |
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;
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.
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.
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.
Führen Sie ALTER TASK … RESUME aus, damit die Aufgabe auf Grundlage der in der Aufgabendefinition angegebenen Parameter ausgeführt werden kann.