Snowpark Container Services: Verwenden von Jobs¶
Wichtig
Das Job-Feature von Snowpark Container Services befindet sich derzeit in der privaten Vorschau und unterliegt den Nutzungsbedingungen für Vorschau-Features unter https://snowflake.com/legal. Weitere Informationen dazu erhalten Sie bei Ihrem Snowflake-Ansprechpartner.
Snowpark Container Services ermöglicht Ihnen die einfache Bereitstellung, Verwaltung und Skalierung von containerisierten Anwendungen als Dienst oder Job. Unter diesem Thema wird die Verwendung von Jobs erläutert. Ein Job hat eine begrenzte Lebensdauer, ähnlich wie eine gespeicherte Prozedur. Wenn alle Anwendungscontainer des Jobs beendet sind, gilt der Job als abgeschlossen.
Ausführen von Jobs¶
Damit Sie Ihre Anwendung als Job bereitstellen können, bietet Snowpark Container Services den Befehl EXECUTE SERVICE. Der Job wird synchron ausgeführt, d. h. er wird abgeschlossen, nachdem alle Container beendet wurden. Sie müssen die folgenden Informationen bereitstellen:
Eine Jobspezifikation: Diese Spezifikation liefert Snowflake die für die Ausführung Ihres Jobs erforderlichen Informationen. Die Spezifikation ist eine YAML-Datei, die Sie in Ihren Snowflake-Stagingbereich hochladen.
Ein Computepool: Snowflake führt Ihren Job in dem angegebenen Computepool aus.
Beispiel
EXECUTE SERVICE
IN COMPUTE POOL tutorial_compute_pool
FROM @tutorial_stage
SPECIFICATION_FILE='my_job_spec.yaml';
Die Ausgabe enthält die Abfrage-ID des Jobs (eine von Snowflake zugewiesene UUID):
+------------------------------------------------------------------------------------+
| status |
-------------------------------------------------------------------------------------+
| Job 01af7ee6-0001-cb52-0020-c5870077223a completed successfully with status: DONE. |
+------------------------------------------------------------------------------------+
Sie verwenden diese Abfrage-Job-ID mit SYSTEM$GET_JOB_STATUS, um den Jobstatus zu erhalten, und mit SYSTEM$GET_JOB_LOGS, um Protokolle von den Jobcontainern zu erhalten.
Die Verwendung des EXECUTE SERVICE-Befehls ist vergleichbar mit der Ausführung aller anderen SQL-Anweisungen. Sie können die Snowsight-Weboberfläche oder SQL verwenden, um eine Jobliste aus dem Abfrageverlauf zu erhalten.
Abrufen der Job-UUID¶
Zum Debuggen Ihrer Jobausführung können Sie die von Snowflake bereitgestellten Systemfunktionen verwenden. Sie können zum Beispiel einen Job mit SYSTEM$GET_JOB_STATUS überwachen und das Protokoll des Jobcontainers mit SYSTEM$GET_JOB_LOGS aufrufen. Beide Systemfunktionen benötigen die Job-UUID (Abfrage-ID des Jobs), die Sie wie folgt erhalten können:
Nach Abschluss des Jobs: Bei kurzen Jobs wird EXECUTE SERVICE schnell abgeschlossen und Sie erhalten die Job-UUID in der Ausgabe. Sie können auch LAST_QUERY_ID unmittelbar nach EXECUTE SERVICE aufrufen, um die Job-UUID zu erfassen.
EXECUTE SERVICE IN COMPUTE POOL tutorial_compute_pool FROM @tutorial_stage SPECIFICATION_FILE='my_job_spec.yaml'; SET job_id = LAST_QUERY_ID();
Beachten Sie, dass LAST_QUERY_ID eine Job-UUID erst nach Beendigung des Jobs bereitstellen kann, sodass er sich vor allem für kurze Jobs eignet.
Während der Jobausführung: Wenn Sie bei Jobs mit langer Ausführungszeit an Echtzeitinformationen zum Jobstatus interessiert sind, während der Job noch ausgeführt wird, können Sie die Job-UUID wie folgt abrufen:
Über die Snowsight-Weboberfläche: Wenn Sie EXECUTE SERVICE aufrufen, gibt die Snowsight-Weboberfläche die Job-UUID im Fenster Ergebnisse sofort zurück, während der Job noch ausgeführt wird.
Mit SnowSQL-CLI:
Öffnen Sie ein neues Terminalfenster mit einer neuen SnowSQL-CLI-Instanz.
Verwenden Sie die QUERY HISTORY-Familie von Tabellenfunktionen, um die Abfrage-ID des Jobs zu erhalten. Rufen Sie in Ihrer neuen Sitzung QUERY_HISTORY_BY_USER auf, um die Abfrage-ID des laufenden Jobs zu erhalten:
SET job_id = (SELECT QUERY_ID FROM TABLE(information_schema. query_history_by_user()) WHERE QUERY_TYPE='EXECUTE_SERVICE' ORDER BY start_time DESC LIMIT 1);
Abbrechen eines Jobs¶
Sie können SYSTEM$CANCEL_JOB-Systemfunktionen verwenden, um einen laufenden Job abzubrechen. Wenn Sie SYSTEM$CANCEL_QUERY aufrufen, um eine Abfrage abzubrechen, die einen Job ausgelöst hat, werden sowohl die Abfrage als auch der Job abgebrochen.
Wenn ein Job abgebrochen wird, werden alle Jobcontainer angehalten und beendet.
Überwachen eines Jobs¶
Sie können die QUERY_HISTORY-Familie von Tabellenfunktionen verwenden, um den Snowflake-Abfrageverlauf abzufragen. Verwenden Sie zum Beispiel QUERY_HISTORY_BY_USER, um aktive Jobs zu finden. Geben Sie in der Abfrage den Abfragetyp EXECUTE_SERVICE
an.
SELECT QUERY_ID FROM TABLE(information_schema. query_history_by_user())
WHERE QUERY_TYPE='EXECUTE_SERVICE'
AND EXECUTION_STATUS='RUNNING'
ORDER BY start_time DESC
Verwenden Sie SYSTEM$GET_JOB_STATUS, um den detaillierten Laufzeitstatus eines Jobs abzurufen. Der Jobstatus gibt an, ob der Job noch ausgeführt wird oder ob er nicht gestartet werden konnte, und wenn ja, warum. Da ein Job keinen Namen hat, verwenden Sie beim Aufrufen dieser Systemfunktion die von Snowflake zugewiesene Abfrage-Job-ID (Job-UUID).
CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000');
Die folgende Beispielausgabe bezieht sich auf einen Job mit einem Container.
Diese Ausgabe zeigt, dass der Job erfolgreich war:
[ { "status":"DONE", "message":"Completed successfully", "containerName":"main", "instanceId":"0", "serviceName":"01af7ee6-0001-cb52-0020-c5870077223a", "image":"orgname-acctname.registry.snowflakecomputing.com/tutorial_db/data_schema/tutorial_repository/my_job_image:tutorial", "restartCount":0, "startTime":"" } ]
Dieses Ausgabefragment zeigt, dass der Job fehlgeschlagen ist:
[ { "status":"FAILED", "message":"Encountered fatal error while running, check container logs", "containerName":"main", "instanceId":"0", ... } ]
Sie können auch SYSTEM$GET_JOB_LOGS verwenden, um auf Containerprotokolle zuzugreifen. Wenn Ihr Code nützliche Protokolle auf die Standardausgabe oder den Standardfehler ausgibt, kann das Protokoll Ihnen helfen, Probleme zu erkennen.
Die instanceId
wird immer 0 sein. Sie können mehrere Instanzen eines Dienstes ausführen, aber es kann immer nur eine Jobinstanz laufen.
SYSTEM$GET_JOB_STATUS kann optional ein timeout_secs
-Wert übergeben werden.
Wenn
timeout_secs
nicht oder mit dem Wert 0 angegeben wird, gibt die Funktion sofort den aktuellen Status zurück.Wenn
timeout_secs
angegeben wird, wartet Snowflake, bis der Job innerhalb der spezifizierten Zeit einen Endzustand (DONE oder FAILED) erreicht hat, bevor es den Jobstatus zurückgibt. Wenn der Job den Endzustand nicht innerhalb der spezifizierten Zeit erreicht, gibt Snowflake am Ende des angegebenen Zeitintervalls den aktuellen Status zurück.
Beispiel
CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000', 10);
Ihr Job kann in mehreren Containern ausgeführt werden (wie in der Jobspezifikationsdatei definiert). Dementsprechend enthält das Ergebnis get_job_status
eine Liste von Objekten und gibt den Status für jeden Container an.
Zugriff auf Containerprotokolle¶
Snowflake erfasst alle Daten, die Ihr Code in Ihrem Anwendungscontainer an die Standardausgabe oder den Standardfehler ausgibt. Sie müssen sicherstellen, dass Ihr Code nützliche Informationen zur Fehlersuche in einem Job ausgibt.
Snowflake bietet zwei Möglichkeiten, auf diese Containerprotokolle zuzugreifen:
Systemfunktion SYSTEM$GET_JOB_LOGS: Diese Funktion ermöglicht den Zugriff auf die Protokolle eines bestimmten Containers. Nach dem Beenden eines Containers können Sie noch eine kurze Zeit lang mithilfe der Systemfunktion auf die Protokolleinträge zugreifen. Systemfunktionen sind am nützlichsten während der Entwicklungs- und Testphase eines neuen Dienstes oder Jobs. Weitere Informationen dazu finden Sie unter Verwenden von SYSTEM$GET_JOB_LOGS.
Ereignistabelle: Eine Ereignistabelle ermöglicht Ihnen den Zugriff auf Protokolleinträge von mehreren Containern über alle Dienste hinweg. Snowflake speichert die Protokolleinträge in der Ereignistabelle für den späteren Zugriff. Ereignistabellen eignen sich am besten für die rückblickende Analyse von Diensten und Jobs. Weitere Informationen dazu finden Sie unter Verwenden einer Ereignistabelle.
Verwenden von SYSTEM$GET_JOB_LOGS¶
Sie geben die Job-ID, den Containernamen und optional die Anzahl der letzten Protokollzeilen an, die abgerufen werden sollen. Beispielsweise ruft die folgende SYSTEM$GET_JOB_LOGS-Funktion für die gegebenen Job-ID die 10 neuesten Protokollzeilen aus einem Container namens main
ab:
CALL SYSTEM$GET_JOB_LOGS('01ab9c76-0000-3c97-0000-0e990009102e', 'main', 10);
Beispielausgabe:
Beispiel für ein Containerprotokoll eines erfolgreichen Jobs:
job-tutorial - INFO - Connection succeeded. Current session context: database="TUTORIAL_DB", schema="DATA_SCHEMA", warehouse="TUTORIAL_WAREHOUSE", role="TEST_ROLE" job-tutorial - INFO - Executing query [select current_time() as time,'hello'] and writing result to table [results] job-tutorial - INFO - Job finished
Beispiel für ein Containerprotokoll eines fehlgeschlagenen Jobs:
job-tutorial - INFO - Job started usage: main.py [-h] --query QUERY --result_table RESULT_TABLE main.py: error: the following arguments are required: --query
Dies bedeutet, dass ein erforderliches Argument nicht angegeben wurde.
Wenn Sie den Containernamen nicht kennen, können Sie zunächst GET_JOB_STATUS ausführen, um Informationen zu den ausgeführten Containern zu erhalten.
Die Ausgabe von SYSTEM$GET_JOB_LOGS hat die folgenden Einschränkungen:
Sie führt die Standardausgabe- und Standardfehlerstreams zusammen, wodurch es unmöglich ist, zwischen regulären Ausgaben und Fehlermeldungen zu unterscheiden.
Sie berichtet die erfassten Daten für einen bestimmten Jobcontainer.
Sie werden nur Protokolle für einen in Ausführung befindlichen Container berichtet.
Die Funktion gibt bis zu 100 KB an Daten zurück.
Verwenden einer Ereignistabelle¶
Snowflake kann Standardausgaben und Standardfehler von Ihren Containern erfassen und in der für Ihr Konto konfigurierten Ereignistabelle erfassen. Weitere Informationen dazu finden Sie unter Übersicht zu Protokollierung und Ablaufverfolgung. Die folgende SELECT-Abfrage ruft beispielsweise die in der letzten Stunde erfassten Dienst- und Jobereignisse von Snowpark Container Services ab:
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
FROM <current-event-table-for-your-account>
WHERE timestamp > dateadd(hour, -1, current_timestamp())
AND RESOURCE_ATTRIBUTES:"snow.executable.type" = 'SnowparkContainers'
ORDER BY timestamp DESC
LIMIT 10;
Snowflake empfiehlt, einen Zeitstempel in die WHERE-Klausel von Ereignistabellenabfragen aufzunehmen, wie in diesem Beispiel gezeigt. Dies ist besonders wichtig wegen der potenziellen Datenmenge, die von verschiedenen Snowflake-Komponenten generiert wird. Durch die Anwendung von Filtern können Sie eine kleinere Teilmenge von Daten abrufen, was die Abfrageleistung verbessert.
Die Spalten der Ereignistabelle enthalten nützliche Informationen zu den von Snowflake erfassten Protokolleinträgen zu Ihrem Container:
TIMESTAMP: Diese Spalte zeigt an, wann Snowflake das Protokoll erfasst hat.
RESOURCE_ATTRIBUTES: Diese Spalte gibt an, von welchem Snowflake-Job und -Jobcontainer der Protokolleintrag erstellt wurde. Sie liefert Details wie die Job-UUID, den Containernamen und den Namen des Computepools.
{ "snow.containers.compute_pool.id":549816068, "snow.containers.compute_pool.name":"TUTORIAL_COMPUTE_POOL", "snow.containers.container.name":"main", "snow.containers.instance.name":"0", "snow.containers.restart.id":"a78230", "snow.database.id":549816076, "snow.database.name":"TUTORIAL_DB", "snow.executable.id":980991975, "snow.executable.name":"01af8425-0001-cb01-0020-c58700758ca6", "snow.executable.type":"SnowparkContainers", "snow.schema.id":549816076, "snow.schema.name":"DATA_SCHEMA" }
RECORD_ATTRIBUTES: Für einen Job identifiziert diese Spalte eine Fehlerquelle (Standardausgabe oder Standardfehler). Beispiel:
{ "log.iostream": "stdout" }
VALUE: In dieser Spalte sind Standardausgabe und Standardfehler in Zeilen unterteilt, und jede Zeile generiert einen Datensatz in der Ereignistabelle.
Konfigurieren einer Ereignistabelle¶
Weitere Informationen dazu finden Sie unter Übersicht zu Protokollierung und Ablaufverfolgung.
Berechtigungen¶
Der Benutzer, der einen Job erstellt hat, kann den Laufzeitstatus des Jobs überwachen und abrufen. Jobs unterstützen nicht das Zuweisen von Berechtigungen zu anderen Benutzern oder Rollen.