작업 그래프를 사용한 작업 종속성 관리

작업 그래프를 사용하면 일련의 작업을 자동으로 실행할 수 있습니다. 작업 그래프 또는 방향성 비순환 그래프(DAG)는 루트 작업과 하위 작업으로 구성된 일련의 작업으로, 종속성에 따라 구성됩니다. 작업 그래프는 한 방향으로 흐르기 때문에 시리즈의 후반에 있는 작업이 이전 작업의 실행을 유도할 수 없습니다. 각 작업은 다른 여러 작업에 따라 달라질 수 있으며 모든 작업이 완료될 때까지 실행되지 않습니다. 각 작업에는 해당 작업에 종속되는 하위 작업이 여러 개 있을 수도 있습니다.

작업 그래프의 작업은 상위 작업의 반환값을 사용하여 SQL 함수 본문에서 논리 기반 작업을 수행할 수도 있습니다.

작업 그래프 만들기

작업 그래프를 만들려면 작업을 만들거나 변경할 때 상위 작업을 지정합니다. 그래프의 루트 작업은 상위 작업이 없는 작업입니다. 루트 작업에는 작업 그래프의 실행을 시작하는 정의된 일정이 있어야 합니다. 각 하위 작업에는 작업 그래프에서 작업을 연결하기 위해 정의된 상위 작업이 하나 이상 있어야 합니다.

CREATE TASK … AFTER 또는 ALTER TASK … ADD AFTER 명령을 사용하여 하위 작업을 추가합니다. Python으로 Snowflake 작업과 작업 그래프를 관리할 수도 있습니다. 자세한 내용은 Python을 사용하여 Snowflake 작업 및 작업 그래프 관리하기 섹션을 참조하십시오.

작업 그래프 고려 사항
  • 작업 그래프는 최대 1,000개의 작업으로 제한됩니다.

  • 단일 작업에는 최대 100개의 상위 작업과 100개의 하위 작업이 있을 수 있습니다.

  • 작업 그래프를 실행하는 컴퓨팅은 동시 작업 실행을 처리할 수 있을 만큼 크기가 조정되어야 합니다. 자세한 내용은 컴퓨팅 리소스 를 참조하십시오.

다음 예제에서는 루트 작업이 작업 B와 C가 동시에 실행되도록 합니다. 작업 D는 작업 B와 C가 모두 실행을 완료했을 때 실행됩니다.

왼쪽에 작업 A가 있고, 루트 작업으로 레이블이 지정되어 있으며, 가운데에 작업 B와 C가 있는 다이아몬드 모양의 작업 그래프입니다. 작업 B와 C는 오른쪽의 작업 D를 가리킵니다.

다음 예제에서는 작업 그래프를 사용하여 팩트 데이터를 집계하기 전에 영업 데이터베이스의 차원 테이블을 업데이트하는 방법을 보여 줍니다.

중앙에 작업이 있는 다이아몬드 모양의 작업 그래프입니다. 왼쪽의 루트 작업은 고객 테이블 업데이트, 제품 테이블 업데이트, 데이터 및 시간 테이블 업데이트 작업을 가리킵니다. 그러면 이 세 작업은 오른쪽의 판매 테이블 집계 작업을 가리킵니다.

이 예제는 작업 그래프에서 외부 함수를 호출하여 이전 작업이 모두 성공적으로 실행되었다는 알림을 원격 메시징 서비스에 전송하도록 하는 마무리 작업을 보여 줍니다.

줄임표를 사용하여 중간 작업을 건너뛴 작업 그래프입니다. 왼쪽의 루트 작업은 줄임표를 가리키고, 줄임표는 오른쪽의 외부 함수를 통해 알림 보내기 최종 작업을 가리킵니다.

작업 그래프 소유권 관리

작업 그래프의 모든 작업은 동일한 작업 소유자를 가져야 하며 동일한 데이터베이스 및 스키마에 저장되어야 합니다.

다음 작업 중 하나를 사용하여 작업 그래프의 모든 작업 소유권을 이전할 수 있습니다.

  • DROP ROLE 을 사용하여 작업 그래프에서 모든 작업의 소유자를 삭제합니다. Snowflake는 DROP ROLE 명령을 실행하는 역할로 소유권을 이전합니다.

  • 스키마의 모든 작업에서 GRANT OWNERSHIP 을 사용하여 작업 그래프에 있는 모든 작업의 소유권을 이전합니다.

이러한 방법을 사용하여 작업 그래프에서 작업 소유권을 이전하면 작업 그래프에 있는 작업 간의 관계가 유지됩니다.

단일 작업의 소유권을 이전하면 작업과 상위 작업, 하위 작업 간의 종속성이 제거됩니다. 자세한 내용은 이 항목의 상위 작업과 하위 작업 연결 해제 섹션을 참조하십시오.

참고

그래프가 복제를 수행하는 역할과 다른 역할에 의해 소유된 경우에는 작업 그래프에 대한 데이터베이스 복제가 작동하지 않습니다.

작업 그래프에서 작업 실행하기

작업 그래프 실행은 정의된 루트 작업의 실행으로 시작됩니다. 루트 작업이 성공적으로 실행된 경우 선행 작업이 완료되면 작업 그래프에서 하위 작업이 연쇄적으로 실행됩니다. 루트 작업은 다음과 같은 방법으로 실행할 수 있습니다.

  • 작업 일정 예약 - 일반적으로 작업 그래프는 CRON 또는 간격 기반 일정에 따라 실행됩니다.

  • ALTER TASK - ALTER TASK [ IF EXISTS ] <이름> RESUME 을 사용하여 기존 일정에 따라 작업 그래프를 실행할 수 있습니다. 모든 작업은 처음 생성되었을 때 다시 시작해야 합니다.

  • EXECUTE TASK - EXECUTE TASK <이름> 을 사용하여 작업 그래프의 일회성 실행을 만들 수 있습니다.

작업 그래프에서 수동으로 작업 실행하기

EXECUTE TASK 명령은 작업에 대해 정의된 일정과 관계없이 작업의 단일 실행을 수동으로 트리거합니다. 루트 작업을 성공적으로 실행하면 마치 루트 작업이 정의된 일정에 따라 실행된 것처럼, 작업 그래프의 하위 작업은 선행 작업이 완료될 때 계단식 실행이 트리거됩니다.

EXECUTE TASK <이름> RETRY LAST 을 사용하여 작업 그래프에서 하위 작업을 다시 실행할 수도 있습니다. RETRY LAST 는 마지막으로 실패한 작업에서 작업 그래프를 실행하려고 시도합니다. 작업이 성공하면 모든 하위 작업은 선행 작업이 완료됨에 따라 계속 실행됩니다.

이 SQL 명령은 프로덕션에서 신규 또는 수정된 작업 그래프가 SQL 코드를 실행하도록 활성화하기 전에 이들을 테스트하는 데 유용합니다.

겹치는 작업 그래프 실행

기본적으로 Snowflake는 특정 작업 그래프의 인스턴스가 한 번에 1개만 실행하는 것을 허용합니다. 작업 그래프에 있는 모든 작업의 실행이 완료된 후에만 루트 작업의 다음 실행이 예약됩니다. 이는 작업 그래프의 모든 작업을 실행하는 데 필요한 누적 시간이 루트 작업의 정의에 설정된 명시적인 예약 시간을 초과할 경우 작업 그래프의 실행을 한 번 이상 건너뛴다는 의미입니다. 동작은 루트 작업의 ALLOW_OVERLAPPING_EXECUTION 매개 변수에 의해 제어되며, 기본값은 FALSE입니다. 매개 변수 값을 TRUE로 설정하면 작업 그래프 실행을 중첩할 수 있습니다.

또한 하위 작업은 그 작업의 모든 선행 작업이 자체 실행을 성공적으로 완료한 후에만 실행을 시작합니다. 시간 집약적인 SQL 작업을 실행하는 작업은 해당 작업을 선행 작업으로 식별하는 하위 작업의 시작을 지연시킵니다.

다음 예에서 작업 그래프 실행은 이전 실행이 아직 완료되지 않았을 때 시작되도록 예약됩니다. 빨간색으로 표시된 부분은 중복되거나 동시 실행이 발생하는 기간입니다. 또한, 이 다이어그램은 사용자 관리 웨어하우스에서 각 작업이 실행되기 전에 큐에서 대기한 기간을 보여줍니다. 서버리스 컴퓨팅 리소스를 사용하는 경우 큐잉 기간이 없습니다.

겹치는 작업 그래프 실행

작업 그래프의 중복 실행으로 인해 실행되는 SQL 읽기/쓰기 작업이 잘못된 데이터 또는 복제된 데이터를 생성하지 않으면 중복 실행이 허용되거나 권장될 수도 있습니다. 하지만 다른 작업 그래프의 경우, 작업 소유자(작업 그래프의 모든 작업에 대한 OWNERSHIP 권한을 가진 역할)가 루트 작업 실행 예약을 올바르게 설정하고 적절한 웨어하우스 크기를 선택(또는 서버리스 컴퓨팅 리소스를 사용)하여 루트 작업의 다음 실행이 예약되기 전에 작업 그래프의 인스턴스가 완료되도록 해야 합니다.

루트 작업에 정의된 일정과 작업 그래프를 더 잘 정렬하는 방법은 다음과 같습니다.

  1. 가능한 경우, 루트 작업 실행 간격의 예약 시간을 늘립니다.

  2. 서버리스 컴퓨팅 리소스를 사용하도록 컴퓨팅 집약적 작업을 수정해 보십시오. 작업이 사용자 관리 컴퓨팅 리소스에 의존하는 경우 작업 그래프에 있는 복잡하거나 대규모 SQL 문 또는 저장 프로시저를 실행하는 웨어하우스 크기를 늘리십시오.

  3. 각 작업이 실행하는 SQL 문 또는 저장 프로시저를 분석합니다. 코드를 다시 작성하여 병렬 처리를 활용할 수 있는지 파악합니다.

위에 설명한 방법으로도 해결되지 않으면, 루트 작업에서 ALLOW_OVERLAPPING_EXECUTION = TRUE로 설정하여 작업 그래프의 동시 실행을 허용할 수도 있습니다. 이 매개 변수는 작업(CREATE TASK 사용)을 만들거나 이후(ALTER TASK 사용 또는 Snowsight 에서)에 정의할 수 있습니다.

작업 그래프에서 작업 일시 중단 및 재개하기

작업 그래프에서 작업을 일시 중단하거나 재개하려면 ALTER TASK … RESUME | SUSPEND or the | sf-web-interface| 를 사용합니다.

루트 작업 일시 중단하기

루트 작업이 일시 중단되면 루트 작업의 향후 예약된 모든 실행이 취소되지만 현재 실행 중인 작업이 있으면 해당 작업과 모든 하위 작업은 계속 실행됩니다.

하위 작업 재개 및 일시 중단하기

하위 작업을 재개하거나 일시 중단하려면 루트 작업을 일시 중단해야 합니다. 중단된 하위 작업을 재개하는 것은 루트 작업을 재개하는 데 반드시 필요한 것은 아닙니다.

재귀적으로 작업 재개

작업 그래프에 있는 모든 작업을 재귀적으로 재개하려면 SYSTEM$TASK_DEPENDENTS_ENABLE 함수를 쿼리합니다.

일시 중단된 하위 작업을 사용한 작업 그래프 실행

작업 그래프가 하나 또는 그 이상의 일시 중단된 하위 작업과 함께 실행 시에는 그와 같은 작업이 무시됩니다. 여러 선행 작업이 있는 하위 작업은 선행 작업 중 하나 이상 이 재개된 상태에 있고 재개된 선행 작업이 전부 성공적으로 실행 완료되는 한 실행됩니다.

작업 그래프 버전 관리

작업 그래프의 루트 작업이 재개되거나 수동으로 실행되면 Snowflake는 작업 그래프에 있는 모든 작업의 모든 속성을 포함하여 전체 작업 그래프의 버전을 설정합니다. 작업이 일시 중단되고 수정된 후, Snowflake는 루트 작업이 재개되거나 수동으로 실행될 때 새 버전을 설정합니다.

작업 그래프에서 작업을 수정하거나 다시 생성하려면 우선 루트 작업을 일시 중단해야 합니다. 루트 작업이 일시 중단되면 루트 작업의 향후 예약된 모든 실행이 취소되지만, 현재 실행 중인 작업이 있는 경우 해당 작업과 모든 하위 작업은 현재 버전을 사용하여 계속 실행됩니다.

참고

작업 그래프가 실행되고 있는 동안 작업이 호출한 저장 프로시저의 정의가 변경되는 경우, 현재 실행 상태에 있는 작업이 저장 프로시저를 호출할 때 새 프로그래밍을 실행할 수 있습니다.

예를 들어 작업 그래프의 루트 작업이 일시 중단되었지만 이 작업의 예약된 실행이 이미 시작되었다고 가정하겠습니다. 루트 작업이 여전히 실행되는 동안 작업 그래프에 있는 모든 작업의 소유자는 하위 작업이 호출한 SQL 코드를 수정합니다. 하위 작업은 루트 작업이 실행을 시작할 때 최신이었던 버전의 작업 그래프를 사용하여 정의에 있는 SQL 코드를 실행합니다. 루트 작업이 다시 시작되거나 수동으로 실행된 후의 새 작업 그래프 버전이 설정됩니다. 이 새 버전에는 하위 작업에 대한 수정 사항이 포함됩니다.

작업 버전 기록을 검색하려면 SNOWFLAKE 공유 데이터베이스에서 TASK_VERSIONS Account Usage 뷰 를 쿼리하십시오.

실패한 작업 실행 후 자동으로 작업 그래프를 일시 중단합니다.

선택적으로 지정된 횟수의 연속 작업 실행이 실패하거나 시간 초과된 후 작업 그래프를 자동으로 일시 중단합니다.

작업 그래프에서 루트 작업의 SUSPEND_TASK_AFTER_NUM_FAILURES = num 매개 변수를 설정합니다. 매개 변수를 0 보다 큰 값으로 설정하면 작업 그래프에서 임의의 하위 작업이 연속적으로 실패하거나 지정된 횟수만큼 시간이 초과되면 루트 작업이 자동으로 일시 중단됩니다. 실패하거나 시간 초과된 하위 작업은 일시 중단되지 않습니다.

실패한 작업 그래프 실행을 자동으로 재시도합니다.

자동 작업 그래프 재시도 횟수를 지정합니다. 작업 그래프가 FAILED 상태로 완료되면 Snowflake는 실패한 그래프의 마지막 작업부터 작업 그래프를 자동으로 다시 시도할 수 있습니다.

자동 작업 그래프 재시도는 기본적으로 비활성화됩니다. 이 기능을 사용하려면 TASK_AUTO_RETRY_ATTEMPTS0 보다 큰 값으로 설정합니다.

작업 그래프에서 종속 작업 보기

루트 작업에 대한 하위 작업을 보려면 TASK_DEPENDENTS 테이블 함수를 쿼리합니다. 작업 그래프에서 모든 작업을 검색하려면 함수를 호출할 때 루트 작업을 입력합니다.

Snowsight 를 사용하여 작업 그래프를 관리하고 볼 수도 있습니다. 자세한 내용은 Snowsight 의 작업 및 작업 그래프 보기 섹션을 참조하십시오.

작업 그래프의 릴리스 및 정리

종료자 작업은 작업 그래프가 사용하는 리소스의 릴리스와 정리를 처리합니다. 종료자 작업은 작업 그래프가 실행되는 경우 실행이 보장되며 모든 시나리오에서 적절한 리소스 정리 및 필수 단계의 완료를 보장합니다. 예를 들어 작업 그래프 실행에서 중간 테이블을 사용하여 처리할 데이터를 추적하고 테이블 행이 사용되기 전에 실패할 경우 다음 실행에서 중복 행이 발견되어 데이터를 다시 처리하게 되므로 실행 시간이 길어지거나 컴퓨팅 리소스가 낭비됩니다. 종료자 작업은 필요에 따라 행을 삭제하거나 테이블을 잘라내어 이 문제를 해결할 수 있습니다.

종료자 작업은 다음과 같은 차이점은 있지만 작업 그래프의 다른 작업처럼 작동합니다.

  • 종료자 작업은 항상 루트 작업과 연결됩니다. 각 루트 작업에는 하나의 종료자 작업만 있을 수 있으며, 종료자 작업은 하나의 루트 작업에만 연결될 수 있습니다.

  • 종료자 작업은 현재 작업 그래프 실행에서 실행 중이거나 큐에 추가된 다른 작업이 없고 그래프에서 하나 이상의 작업이 실행을 시작한 경우에만 예약됩니다. 그래프를 건너뛰는 경우(예: 루트 작업을 건너뛰는 경우) 종료자 작업은 실행되지 않습니다. ALLOW_OVERLAPPING_EXECUTION이 true인 경우 종료자 작업은 다른 작업처럼 동작하며 진행 중인 다른 작업 그래프 실행이 있더라도 계속 예약됩니다.

  • 종료자 작업에는 하위 작업이 있을 수 없습니다. 종료자 작업을 선행 작업으로 만들려는 모든 명령은 실패합니다. 종료자 작업 생성에는 SCHEDULEAFTER 키워드와 모두 호환되지 않는 FINALIZE 키워드가 포함되어야 합니다.

종료자 작업을 생성하려면 FINALIZE 키워드를 사용하여 작업을 생성하고 루트 작업에 대한 관계를 설정합니다.

CREATE TASK <TASK_NAME> ...
... FINALIZE = <ROOT_TASK_NAME>
Copy

자세한 내용은 CREATE TASK 섹션을 참조하십시오.