EXECUTE JOB SERVICE
EXECUTE JOB SERVICE
Snowpark Container Services 서비스를 작업(job)으로 실행하는 명령이에요. 작업은 코드가 종료될 때 종료되는 서비스로, 저장 프로시저와 비슷해요. 모든 컨테이너가 종료되면 작업이 완료돼요.
출처: 문서
본문
CREATE SERVICE로 만든 서비스는 장기 실행되며 더 이상 필요하지 않을 때 명시적으로 중지해야 해요. 반면 EXECUTE JOB SERVICE로 만든 작업은 코드가 종료될 때 종료되는 서비스예요.
기본적으로 작업은 동기적으로 실행되며, EXECUTE JOB SERVICE 명령은 모든 컨테이너가 종료된 후에만 끝나요. 선택적으로 ASYNC 파라미터를 지정하여 작업 서비스를 비동기로 실행할 수도 있으며, 이 경우 명령은 작업이 실행되는 동안 즉시 반환돼요. DESCRIBE SERVICE 명령으로 작업 완료를 폴링한 다음 SYSTEM$WAIT_FOR_SERVICES 함수를 호출하여 작업 완료를 기다릴 수 있어요.
작업 서비스가 완료된 후 Snowflake는 비용을 줄이기 위해 작업 서비스에 할당된 리소스를 자동으로 정리해요. DESCRIBE SERVICE와 SHOW SERVICES 명령으로 최대 30일 동안 작업 메타데이터에 접근할 수 있어요. 30일이 지나면 Snowflake가 자동으로 작업을 삭제해요.
작업이 완료될 때 해당 컴퓨팅 풀 노드에서 다른 작업이나 서비스가 실행 중이지 않으면, Snowflake는 노드를 유휴 상태로 간주하고 재확보할 수 있어요. 이 경우 SYSTEM$GET_SERVICE_LOGS는 작업 컨테이너의 로컬 컨테이너 로그를 반환하지 않아요. 컨테이너 로그를 이벤트 테이블에 영속하는 것을 고려해볼 수 있어요.
명령 파라미터는 특정 순서로 지정해야 해요.
구문 (Syntax)
EXECUTE JOB SERVICE
IN COMPUTE POOL <compute_pool_name>
{
fromSpecification
| fromSpecificationTemplate
}
[ NAME = [<db>.<schema>.]<name> ]
[ ASYNC = { TRUE | FALSE } ]
[ REPLICAS = <num> ]
[ QUERY_WAREHOUSE = <warehouse_name> ]
[ COMMENT = '<string_literal>' ]
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <EAI_name> [ , ... ] ) ]
여기서:
fromSpecification ::=
{
FROM @<stage> SPECIFICATION_FILE = '<yaml_file_stage_path>'
| FROM SPECIFICATION <specification_text>
}
fromSpecificationTemplate ::=
{
FROM @<stage> SPECIFICATION_TEMPLATE_FILE = '<yaml_file_stage_path>'
| FROM SPECIFICATION_TEMPLATE <specification_text>
}
USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] )
필수 파라미터 (Required parameters)
- IN COMPUTE POOL compute_pool_name — 서비스를 실행할 계정의 컴퓨팅 풀 이름을 지정해요.
- FROM stage — 명세 파일이 저장된 Snowflake 내부 스테이지를 지정해요. 예:
@tutorial_stage. - SPECIFICATION_FILE = 'yaml_file_stage_path' — 스테이지의 서비스 명세 파일 경로를 지정해요. 예:
'some-dir/echo_spec.yaml'. - SPECIFICATION_TEMPLATE_FILE = 'yaml_file_stage_path' — 스테이지의 서비스 명세 템플릿 파일 경로를 지정해요. 예:
'some-dir/echo_template_spec.yaml'.SPECIFICATION_TEMPLATE_FILE을 지정하면 USING 파라미터가 필요해요. - FROM SPECIFICATION specification_text — 서비스 명세를 지정해요. 명세 문자열의 시작과 끝을 구분하려면 한 쌍의 달러 기호($$)를 사용할 수 있어요.
- FROM SPECIFICATION_TEMPLATE specification_text — 서비스 명세를 지정해요. 명세 문자열의 시작과 끝을 구분하려면 한 쌍의 달러 기호($$)를 사용할 수 있어요.
SPECIFICATION_TEMPLATE을 지정하면 USING 파라미터가 필요해요.
선택 파라미터 (Optional parameters)
- NAME = [db.schema.]name — 작업처럼 실행되는 서비스의 이름(식별자)를 지정해요. 서비스가 생성되는 스키마 내에서 고유해야 해요. 특수 문자나 대소문자 구분 이름에 대한 따옴표 이름은 지원되지 않아요. 이 제약은 서비스를 만드는 데이터베이스와 스키마 이름에도 적용돼요. 기본값: 지정하지 않으면 Snowflake가
JOB_<query_job_uuid>형식의 이름을 생성해요. - ASYNC = { TRUE | FALSE } — 작업을 비동기로 실행할지 여부를 지정해요. 기본값: FALSE
- REPLICAS = num — 실행할 작업 복제본 수를 지정해요. 기본값: 1.
- QUERY_WAREHOUSE = warehouse_name — 서비스 컨테이너가 쿼리를 실행하기 위해 Snowflake에 연결할 때 사용할 웨어하우스를 명시적으로 지정하지 않은 경우 사용할 웨어하우스. 이 파라미터는 Native Apps의 객체 참조도 지원해요. 기본값: 없음
- EXTERNAL_ACCESS_INTEGRATIONS = ( EAI_name [ , ... ] ) — 작업이 외부 사이트에 접근할 수 있게 하는 외부 액세스 통합의 이름을 지정해요. 이 목록의 이름은 대소문자를 구분해요. 기본적으로 애플리케이션 컨테이너는 인터넷에 접근할 권한이 없어요. 작업이 외부 사이트에 접근하도록 허용하려면 외부 액세스 통합(EAI)을 만들고 작업이 그 통합을 사용하도록 구성해요.
- COMMENT = 'string_literal' — 서비스에 대한 주석을 지정해요. 기본값: 없음
- TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) — 태그 이름과 태그 문자열 값을 지정해요. 태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256이에요.
- USING ( key => value [ , key => value [ , ... ] ] ) — 명세 템플릿 확장을 파라미터화하기 위한 값을 제공할 수 있어요. USING은 명세 템플릿(
FROM SPECIFICATION_TEMPLATE_FILE또는FROM SPECIFICATION_TEMPLATE)을 사용할 때 필요해요. 키-값 쌍은 쉼표로 구분된 목록을 형성해야 해요. 여기서:- key는 템플릿 변수의 이름이고, 템플릿 변수 이름은 선택적으로 큰따옴표(")로 묶을 수 있어요.
- value는 템플릿에서 변수에 할당할 값이에요. 문자열 값은
'또는$$로 묶어야 해요. 값은 알파벳숫자거나 유효한 JSON이어야 해요.
접근 제어 요구사항 (Access control requirements)
이 작업을 실행하는 역할은 최소한 다음 권한을 가져야 해요:
| Privilege | Object | Notes |
|---|---|---|
| CREATE SERVICE | Schema | |
| USAGE | Compute pool | |
| READ | Stage | 명세가 저장된 스테이지. |
| READ | Image Repository | 명세가 참조하는 이미지의 리포지토리. |
스키마에서 객체를 운영하려면 부모 데이터베이스에 대한 권한이 하나 이상, 부모 스키마에 대한 권한이 하나 이상 필요해요.
사용 메모 (Usage notes)
EXECUTE JOB SERVICE를 호출할 때 파라미터는 다음 순서로 제공해야 해요: 컴퓨팅 풀을 지정하고, 다른 속성을 지정하고, 마지막으로 서비스 명세(스테이지의 명세 파일 이름 또는 인라인 명세)를 지정해요.- 메타데이터에 관해: Snowflake 서비스 사용 시 개인 데이터(User 객체 외), 민감한 데이터, 수출 통제 데이터 또는 기타 규제 데이터를 메타데이터로 입력하지 않도록 해야 해요.
예시 (Examples)
작업 비동기 실행
Snowpark Container Services 작업 서비스를 비동기로 실행해요.
EXECUTE JOB SERVICE
IN COMPUTE POOL tutorial_compute_pool
NAME = tutorial_db.data_schema.example_job
ASYNC = TRUE
FROM @tutorial_stage
FROM SPECIFICATION $$
$$;
블록 스토리지가 마운트된 작업 실행
명세에 블록 스토리지가 구성된 작업 서비스를 실행해요.
EXECUTE JOB SERVICE
IN COMPUTE POOL tutorial_compute_pool
NAME=tutorial_job_service
FROM SPECIFICATION $$
spec:
container:
- name: main
image: /tutorial_db/data_schema/tutorial_repository/my_job_image:latest
volumeMounts:
- name: block-vol1
mountPath: /opt/block/path
volumes:
- name: block-vol1
source: block
size: 10Gi
blockConfig:
iops: 4000
throughput: 200
$$;
명령이 선택적 ASYNC 파라미터를 지정하지 않으므로 Snowflake는 명령을 동기적으로 실행해요.
배치 작업 실행
REPLICAS 파라미터를 지정하여 작업 서비스의 3개 인스턴스를 실행해요.
EXECUTE JOB SERVICE
IN COMPUTE POOL my_pool
NAME = tutorial_2_job_service
REPLICAS = 3
FROM SPECIFICATION $$
spec:
containers:
- name: main
image: my_repo/my_job_image:latest
$$;
각 작업 서비스 복제본의 상태를 찾으려면 SHOW SERVICE INSTANCES IN SERVICE 명령을 사용해요:
SHOW SERVICE INSTANCES IN SERVICE tutorial_2_job_service;
예시 출력:
+---------------+-------------+------------------------+----------------+-------------+-----------+------------------------------------------------------------------+----------------------+----------------------+--------------+
| database_name | schema_name | service_name | service_status | instance_id | status | spec_digest | creation_time | start_time | ip_address |
|---------------+-------------+------------------------+----------------+-------------+-----------+------------------------------------------------------------------+----------------------+----------------------+--------------|
| TUTORIAL_DB | DATA_SCHEMA | TUTORIAL_2_JOB_SERVICE | DONE | 0 | SUCCEEDED | 80b42d8e1ec39dbaa7e2b9b6591e4b0cc11f74304703f56b50e1dfc10f421ac5 | 2025-08-07T00:44:49Z | 2025-08-07T00:44:49Z | 10.244.0.11 |
| TUTORIAL_DB | DATA_SCHEMA | TUTORIAL_2_JOB_SERVICE | DONE | 1 | SUCCEEDED | 80b42d8e1ec39dbaa7e2b9b6591e4b0cc11f74304703f56b50e1dfc10f421ac5 | 2025-08-07T00:44:49Z | 2025-08-07T00:44:57Z | 10.244.0.12 |
| TUTORIAL_DB | DATA_SCHEMA | TUTORIAL_2_JOB_SERVICE | DONE | 2 | SUCCEEDED | 80b42d8e1ec39dbaa7e2b9b6591e4b0cc11f74304703f56b50e1dfc10f421ac5 | 2025-08-07T00:44:49Z | 2025-08-07T00:44:49Z | 10.244.0.203 |
+---------------+-------------+------------------------+----------------+-------------+-----------+------------------------------------------------------------------+----------------------+----------------------+--------------+
출력에서 instance_id와 status 열이 복제본 번호와 그 상태를 보여줘요.