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';
Copy

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();
    
    Copy

    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:

      1. Öffnen Sie ein neues Terminalfenster mit einer neuen SnowSQL-CLI-Instanz.

      2. 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);
        
        Copy

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
Copy

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');
Copy

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":""
       }
    ]
    
    Copy
  • Dieses Ausgabefragment zeigt, dass der Job fehlgeschlagen ist:

    [
       {
          "status":"FAILED",
          "message":"Encountered fatal error while running, check container logs",
          "containerName":"main",
          "instanceId":"0",
          ...
       }
    ]
    
    Copy

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);
Copy

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);
Copy

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;
Copy

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"
    }
    
    Copy
  • RECORD_ATTRIBUTES: Für einen Job identifiziert diese Spalte eine Fehlerquelle (Standardausgabe oder Standardfehler). Beispiel:

    {
      "log.iostream": "stdout"
    }
    
    Copy
  • 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.