on_error

on_error (오류 시 하위 모델 처리)

on_error 설정은 실행 중에 모델이 실패했을 때 다운스트림(하위) 모델이 어떻게 될지를 제어해요. skip_children(기본값)과 continue 두 값을 받아요. dbt v1.12 또는 dbt "v1 Latest" 릴리스 트랙에서 사용할 수 있어요.

출처: dbt 공식 문서

본문

설정 방법

프로젝트 파일

dbt_project.yml

models:
  <resource-path>:
    +on_error: skip_children | continue

프로퍼티 파일

models/properties.yml

models:
  - name: [<model-name>]
    config:
      on_error: skip_children | continue

SQL 설정

models/<model_name>.sql

{{ config(
    on_error="skip_children" | "continue"
) }}

정의

on_error 설정은 실행 중에 모델이 실패했을 때 다운스트림(하위) 모델이 어떻게 될지를 제어해요. 이 설정은 모델에만 적용되고 테스트에는 효과가 없어요. 테스트 실패 후 다운스트림 모델 실행 여부를 제어하려면 대신 테스트의 severity 설정을 사용해요.

on_error는 두 값을 받아요.

  • skip_children (기본값): 모델이 실패하면 모든 다운스트림 모델이 건너뛰어져요.
  • continue: 모델이 실패해도 다운스트림 모델이 건너뛰어지지 않고 계속 실행돼요.

예시

업스트림 모델이 실패해도 다운스트림 모델이 의미 있게 계속 실행될 수 있을 때(예: fallback 로직이나 독립적인 데이터 소스가 있을 때) on_error: continue를 설정해요.

models/my_model.sql

{{ config(
    materialized='table',
    on_error='continue'
) }}

select 1 as id

실패한 모델에 on_errorcontinue로 설정돼 있으면 dbt는 다운스트림 모델을 건너뛰지 않고 실행해요. 실패한 모델은 여전히 실행 결과에 오류로 표시되고, 다운스트림 모델이 모두 성공해도 전체 실행은 여전히 실패해요.

--fail-fast 플래그는 on_error: continue보다 우선해요. --fail-fast가 설정되면 dbt는 첫 번째 실패에서 멈추고 on_error 설정과 무관하게 남은 모든 모델을 건너뛰어요.

여러 업스트림 모델이 있을 때의 동작

모델에 업스트림 모델이 여러 개면 skip_childrencontinue보다 우선해요. 실패한 업스트림 모델 중 하나라도 skip_children을 쓰면, 다른 실패한 업스트림 모델이 continue를 써도 다운스트림 모델은 건너뛰어져요.

예를 들어 model_cmodel_amodel_b 둘 다에 의존하는 DAG를 생각해 봐요.

  • model_aon_error: skip_children 사용
  • model_bon_error: continue 사용

다음 표는 업스트림 모델의 결과에 따라 model_c가 어떻게 동작하는지 보여줘요.

model_a 결과 (skip_children) model_b 결과 (continue) model_c 동작
성공 성공 실행
오류 성공 건너뜀
성공 오류 실행
오류 오류 건너뜀

model_a가 오류면 model_cmodel_askip_children을 쓰므로 항상 건너뛰어져요. model_b만 오류면 model_cmodel_bcontinue를 써서 다운스트림을 막지 않으므로 여전히 실행돼요.

더 알아보기 (Learn more)

  • severity — 테스트 실패 심각도 설정
  • --fail-fast — 첫 실패 시 모든 모델 건너뛰기