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. |
+------------------------------------------------------------------------------------+

SYSTEM$GET_JOB_STATUS와 함께 이 쿼리 작업 ID을 사용하여 작업 상태를 가져오며, 작업 컨테이너에서 로그를 가져오려면 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

다음 샘플 출력은 하나의 컨테이너가 있는 작업의 출력입니다.

  • 이 출력은 작업이 성공했음을 보여줍니다.

    [
       {
             "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입니다. 서비스의 여러 인스턴스를 실행할 수 있지만, 한 번에 하나의 작업 인스턴스만 실행할 수 있습니다.

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는 이러한 컨테이너 로그에 액세스하는 두 가지 방법을 제공합니다.

  • SYSTEM$GET_JOB_LOGS 시스템 함수 사용: 이 함수는 특정 컨테이너의 로그에 대한 액세스 권한을 제공합니다. 컨테이너가 종료된 후에도 잠시 동안 시스템 함수를 사용하여 로그에 계속 액세스할 수 있습니다. 시스템 함수는 초기 개발 및 테스트 중에 가장 유용합니다. 자세한 내용은 SYSTEM$GET_JOB_LOGS 사용하기 섹션을 참조하십시오.

  • 이벤트 테이블 사용: 이벤트 테이블을 사용하면 모든 서비스에 걸쳐 여러 컨테이너의 로그에 액세스할 수 있습니다. Snowflake는 나중에 액세스할 수 있도록 이벤트 테이블에 로그를 유지합니다. 이벤트 테이블은 서비스와 작업의 회고적 분석에 가장 적합합니다. 자세한 내용은 이벤트 테이블 사용하기 섹션을 참조하십시오.

SYSTEM$GET_JOB_LOGS 사용하기

작업 ID, 컨테이너 이름, 선택적으로 검색할 가장 최근 로그 줄 수를 제공합니다. 예를 들어, 지정된 작업 ID에 대해 다음 SYSTEM$GET_JOB_LOGS 함수는 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 출력에는 다음과 같은 제한 사항이 있습니다.

  • 표준 출력과 표준 오류 스트림을 병합하므로, 일반 출력과 오류 메시지를 구별하는 것이 불가능합니다.

  • 특정 작업 컨테이너에 대해 캡처된 데이터를 보고합니다.

  • 실행 중인 컨테이너에 대한 로그만 보고합니다.

  • 이 함수는 최대 100KB의 데이터를 반환합니다.

이벤트 테이블 사용하기

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

이 예에 표시된 것처럼 이벤트 테이블 쿼리의 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: 이 열에서는 표준 출력과 표준 오류가 줄로 나뉘며 각 줄은 이벤트 테이블에 레코드를 생성합니다.

이벤트 테이블 구성하기

자세한 내용은 로깅 및 추적 개요 섹션을 참조하십시오.

권한

작업을 생성한 사용자는 작업의 런타임 상태를 모니터링하고 가져올 수 있습니다. 작업은 다른 사용자나 역할에 대한 권한 부여를 지원하지 않습니다.