Airflow 에서 재실행은 별도 rerun 버튼이 아니라 태스크를 Clear 하는 것이다. task instance 를 clear 하면 try_number 가 올라가고 state 가 None 이 되면서 다시 실행된다. 3 버전도 같다.
달라진 것은 UI 표기다. 3 에서는 Clear 라는 글자 대신 각 태스크 행 오른쪽의 원형 화살표(↻) 아이콘이 그 역할을 한다. 누르면 downstream 까지 같이 돌릴지 묻는다.
"실패한 것만 한 번에" 는 3 UI 에서 깔끔하게 안 된다. 2.x 에 있던 일괄 clear 가 빠지거나 동작이 달라진 부분이라 못 찾는 것이 아니다. CLI 가 정답이다.
airflow tasks clear <dag_id> --only-failed -s <start_date> -e <end_date>
-s · -e 를 해당 run 의 logical date 로 좁히면 그 안의 실패 태스크만 clear 된다. 성공한 것은 건드리지 않는다.
Airflow 3 의 partitioned asset 은 "값 전달" 과 "같은 키끼리 정렬해서 트리거" 를 함께 한다. consumer 가 정의할 수 있는 것은 mapper 를 통한 키 정규화와 검증뿐이다.
| 가능 | 불가능 |
|---|---|
입도 정규화(StartOfDayMapper, StartOfHourMapper 등) |
키가 다를 때 임의 로직으로 합치기 |
복합 키 세그먼트 매핑(ProductMapper) |
max 선택 · 조건 분기 · 커스텀 merge |
허용 키 검증(AllowedKeyMapper) |
|
asset 별 mapper 지정, default_partition_mapper 로 전체 기본값 |
멀티 asset 결합은 &(AND) 와 |(OR) 논리식만 쓴다. AND 는 두 asset 이 같은 partition_key 로 갱신됐을 때만 run 을 띄운다. 키가 다르면 키마다 별도의 pending run 이 생기고 서로를 리셋하지 않는다. dbt 처럼 AND 조건을 많이 쓰는 파이프라인에서 부모들의 날짜가 어긋나면 그대로 멈춘다.
StartOfDayMapper 의 출력 포맷은 YYYY-MM-DD 다.
수동 재실행에는 partition_key 가 없다. partition 되는 것은 scheduled 와 backfill 타입 run 뿐이고, manual run 은 Trigger 설정에서 직접 주지 않으면 partition 되지 않는다. UI 에서 실패 DAG 를 수동 재실행하면 dag_run.partition_key 가 None 이라 그것을 쓰는 코드가 터지거나 now() 로 흘러간다. 수동 경로에 가드를 반드시 넣는다. 키가 없으면 Trigger config 로 받게 강제하거나 명시적으로 에러를 낸다.
체인 전체가 partition-aware 여야 한다. CronPartitionTimetable 이 내보낸 partitioned 이벤트는 partition-aware 하지 않은 DAG 를 트리거하지 않는다. 체인 중간에 일반 schedule=Asset(...) consumer 가 하나라도 끼면 거기서 전파가 끊긴다. 에러 없이 조용히 멈추므로 전수 점검이 필요하다.
generator 는 기본 mapper 로 줄인다. asset 마다 {asset: StartOfDayMapper()} 를 만들 것 없이 체인이 전부 일 단위라면 default_partition_mapper=StartOfDayMapper() 하나로 대체된다.
extra 는 이벤트에 붙은 메타데이터일 뿐이라 스케줄러가 그것으로 run 을 묶지 않는다. 값은 정확히 전달되지만 트리거 조건은 일반 asset 과 똑같이 동작하므로 멀티 부모 날짜 동기화는 손으로 구현해야 한다.
# producer
context["outlet_events"][my_asset].extra = {"base_date": "20260605"}
# consumer
for asset, events in context["triggering_asset_events"].items():
for e in events:
base_date = e.extra.get("base_date")
날짜 동기화가 필요하면 partition_key 를, 부가 값만 실어 나르면 되면 extra 를 쓴다. 둘은 푸는 문제가 다르다.