Snowpark Container Services: ジョブの操作

重要

Snowpark Container Servicesのジョブ機能は現在プライベートプレビュー中であり、 https://snowflake.com/legal のプレビュー規約に従うものとします。詳細については、Snowflakeの担当者にお問い合わせください。

Snowpark Container Services を使用すると、コンテナー化されたアプリケーションをサービスまたはジョブとして簡単に展開、管理、スケールできるようになります。このトピックでは、ジョブの操作について説明します。ジョブには、ストアドプロシージャと同様に有効期限があります。ジョブのアプリケーションコンテナーがすべて終了すると、そのジョブは完了したとみなされます。

ジョブの実行

アプリケーションをジョブとして展開するために、Snowpark Container Servicesは EXECUTE SERVICE コマンドを提供します。ジョブは、同期的に実行され、すべてのコンテナーが終了した後に完了します。以下の情報が必要です。

  • ジョブ仕様: この 仕様 は、ジョブの実行に必要な情報をSnowflakeに提供します。仕様は、Snowflakeステージにアップロードする YAML ファイルです。

  • コンピューティングプール: Snowflakeは、指定された コンピューティングプール でジョブを実行します。

EXECUTE SERVICE
  IN COMPUTE POOL tutorial_compute_pool
  FROM @tutorial_stage
  SPECIFICATION_FILE='my_job_spec.yaml';
Copy

出力にはジョブのクエリ ID (Snowflakeで割り当てられた UUID)が含まれます。

+------------------------------------------------------------------------------------+
|                      status                                                        |
-------------------------------------------------------------------------------------+
| Job 01af7ee6-0001-cb52-0020-c5870077223a completed successfully with status: DONE. |
+------------------------------------------------------------------------------------+

このクエリジョブ ID を、 SYSTEM$GET_JOB_STATUS で使用してジョブステータスを取得し、 SYSTEM$GET_JOB_LOGS で使用してジョブコンテナーからログを取得します。

EXECUTE SERVICE コマンドの使用方法は、他の SQL ステートメントを実行する場合と同様です。Snowsightのウェブインターフェイスまたは SQL を使用して、クエリ履歴からジョブリストを取得できます。

ジョブ UUID の取得

ジョブの実行をデバッグするには、Snowflakeが提供するシステム関数を使用できます。たとえば、 SYSTEM$GET_JOB_STATUS を使用してジョブをモニターし、 SYSTEM$GET_JOB_LOGS を使用してジョブコンテナーログにアクセスすることができます。これらのシステム関数はどちらもジョブ UUID (ジョブのクエリ ID)を必要とし、それは以下のようにして取得できます。

  • ジョブ完了後: 短いジョブの場合、 EXECUTE SERVICE はすぐに完了し、 UUID のジョブが出力されます。また、 EXECUTE SERVICE の直後に LAST_QUERY_ID を呼び出して UUID のジョブをキャプチャすることもできます。

    EXECUTE SERVICE
    IN COMPUTE POOL tutorial_compute_pool
    FROM @tutorial_stage
    SPECIFICATION_FILE='my_job_spec.yaml';
    
    SET job_id = LAST_QUERY_ID();
    
    Copy

    LAST_QUERY_ID は、ジョブが完了した後にのみジョブ UUID を提供するため、主に短いジョブに適していることに注意してください。

  • ジョブ実行中: 長時間実行中のジョブについて、実行中ジョブのリアルタイムのジョブステータス情報に関心がある場合は、以下のようにしてジョブ UUID を取得できます。

    • Snowsightウェブインターフェイスで EXECUTE SERVICE を呼び出すと、Snowsightウェブインターフェイスはジョブを実行したまま、 結果 ウィンドウにジョブ UUID を即座に返します。

    • SnowSQL CLI を使用して、

      1. 新しい SnowSQL CLI インスタンスを実行する新しいターミナルウィンドウを開きます。

      2. テーブル関数の QUERY HISTORY ファミリーを使用して、ジョブのクエリ ID を取得します。新しいセッションで QUERY_HISTORY_BY_USER を呼び出し、実行中のジョブのクエリ ID を取得します。

        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

ジョブのキャンセル

実行中のジョブをキャンセルするには、 SYSTEM$CANCEL_JOB システム関数を使用します。ジョブをトリガーしたクエリをキャンセルするために SYSTEM$CANCEL_QUERY を呼び出すと、クエリとジョブの両方がキャンセルされます。

ジョブがキャンセルされると、すべてのジョブコンテナーは実行を停止して終了します。

ジョブのモニタリング

テーブル関数の QUERY_HISTORY ファミリーを使用して、Snowflakeのクエリ履歴をクエリできます。たとえば、実行中のジョブを検索するには QUERY_HISTORY_BY_USER を使用します。クエリでは、クエリ型として EXECUTE_SERVICE を指定します。

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

ジョブの詳細な実行時ステータスを取得するには、 SYSTEM$GET_JOB_STATUS を使用します。ジョブステータスは、ジョブがまだ実行中か、開始に失敗したか、失敗した場合はその理由を示すことができます。ジョブには名前がないため、このシステム関数を呼び出すときは、Snowflakeに割り当てられたクエリジョブ ID (ジョブ UUID)を使用します。

CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000');
Copy

以下のサンプル出力は、コンテナーが1つあるジョブのものです。

  • この出力は、ジョブが成功したことを示しています。

    [
       {
             "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
  • この出力は、ジョブが失敗したことを示しています。

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

また、 SYSTEM$GET_JOB_LOGS を使用して コンテナーログ にアクセスすることもできます。コードが標準出力や標準エラーに有用なログを出力する場合、ログは問題を特定するのに役立ちます。

instanceId は常に0になります。サービスの複数のインスタンスを実行することはできますが、一度に実行できるジョブインスタンスは1つのみです。

SYSTEM$GET_JOB_STATUS は、オプションの timeout_secs パラメーターを取得します。

  • timeout_secs が指定されないか、値0で指定された場合、この関数はただちに現在のステータスを返します。

  • timeout_secs が指定されている場合、Snowflakeは指定された時間内にジョブが終了状態(DONE または FAILED)になるまで待ってからジョブステータスを返します。指定された時間内にジョブが終了状態に到達しない場合、Snowflakeは指定された時間間隔の終了時に現在の状態を返します。

CALL SYSTEM$GET_JOB_STATUS('01ab9c76-0000-3c97-0000-0e9900000000', 10);
Copy

ジョブは複数のコンテナーで実行できます(ジョブ仕様ファイルで定義)。したがって、 get_job_status の結果はオブジェクトのリストを含み、各コンテナーのステータスを提供します。

コンテナーログへのアクセス

Snowflakeは、コンテナー内のコードが標準出力または標準エラーに出力するものをすべて収集します。コードがジョブのデバッグに有用な情報を出力するようにしてください。

Snowflakeは、これらのコンテナーログにアクセスする2つの方法を提供します。

  • SYSTEM$GET_JOB_LOGS システム関数の使用: この関数により、特定のコンテナーからログにアクセスできます。コンテナーが終了した後も、しばらくはシステム関数を使用してログにアクセスできます。システム関数は、初期開発とテスト時に最も役立ちます。詳細については、 SYSTEM$GET_JOB_LOGS の使用 をご参照ください

  • イベントテーブルの使用: イベントテーブルを使用すると、すべてのサービスにわたる複数のコンテナーからログにアクセスできます。Snowflakeは、後でアクセスできるようにイベントテーブルにログを永続化します。イベントテーブルは、サービスやジョブのレトロスペクティブな分析に最適です。詳細については、 イベントテーブルの使用 をご参照ください。

SYSTEM$GET_JOB_LOGS の使用

ジョブ ID、コンテナー名、およびオプションとして取得する最新のログ行数を指定します。たとえば、次の SYSTEM$GET_JOB_LOGS 関数は、与えられたジョブ ID に対して、 main という名前のコンテナーから10行の最新のログ行を取得します。

CALL SYSTEM$GET_JOB_LOGS('01ab9c76-0000-3c97-0000-0e990009102e', 'main', 10);
Copy

サンプル出力:

  • 成功したジョブのコンテナーログのサンプル:

    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
    
  • 失敗したジョブのコンテナーログのサンプル:

    job-tutorial - INFO - Job started
    usage: main.py [-h] --query QUERY --result_table RESULT_TABLE
    main.py: error: the following arguments are required: --query
    

    これは、必要な引数が提供されなかったことを示しています。

コンテナー名が分からない場合は、まず GET_JOB_STATUS を実行して、実行中のコンテナーに関する情報を取得することができます。

SYSTEM$GET_JOB_LOGS 出力には以下の制限があります。

  • 標準出力と標準エラーのストリームをマージするため、通常の出力とエラーメッセージの区別がつかなくなる。

  • 特定のジョブコンテナーのキャプチャデータを報告する。

  • 実行中のコンテナーのログのみを報告する。

  • 関数は100 KB までのデータを返す。

イベントテーブルの使用

Snowflakeは、コンテナーからの標準出力と標準エラーをキャプチャし、アカウント用に設定されたイベントテーブルに記録することができます。詳細については、 ログおよびトレースの概要 をご参照ください。たとえば、以下の SELECT クエリは、過去1時間に記録されたSnowpark Container Servicesのサービスとジョブイベントを取得します。

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は、この例に示すように、イベントテーブルクエリの WHERE 句にタイムスタンプを含めることを推奨します。さまざまなSnowflakeコンポーネントによって生成される潜在的データ量のため、これは特に重要です。フィルターを適用すると、より小さなデータのサブセットを取得することができ、クエリのパフォーマンスが向上します。

イベントテーブルの列は、コンテナーからSnowflakeが収集したログに関する有用な情報を提供します。

  • TIMESTAMP: この列は、Snowflakeがいつログを収集したかを示します。

  • RESOURCE_ATTRIBUTES: この列は、どのSnowflakeジョブとジョブコンテナーがログを生成したかを明示します。これは、ジョブ UUID、コンテナー名、コンピューティングプール名などの詳細を提供します。

    {
       "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: ジョブの場合、この列はエラーソース(標準出力または標準エラー)を識別します。例:

    {
      "log.iostream": "stdout"
    }
    
    Copy
  • VALUE: この列では、標準出力と標準エラーが行に分割され、各行がイベントテーブルに記録を生成します。

イベントテーブルの構成

詳細については、 ログおよびトレースの概要 をご参照ください。

権限

ジョブを作成したユーザーは、ジョブの実行ステータスをモニターし、取得することができます。ジョブは、他のユーザーやロールへの権限付与をサポートしていません。