Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 자연어 논문
- HackerRank
- sql
- SQL코테
- update
- 자연어처리
- MySQL
- 카이제곱분포
- 자연어 논문 리뷰
- Statistics
- Window Function
- inner join
- 코딩테스트
- CASE
- NLP
- sigmoid
- t분포
- LSTM
- 설명의무
- 그룹바이
- torch
- leetcode
- nlp논문
- GRU
- SQL 날짜 데이터
- 표준편차
- 짝수
- airflow
- 서브쿼리
- 논문리뷰
Archives
- Today
- Total
HAZEL
[ Airflow ] Scheduling 개념 / execution_date 본문
DATA ENGINEERING/Data Engineering
[ Airflow ] Scheduling 개념 / execution_date
Rmsid01 2022. 4. 29. 20:171. 스케쥴링 개념
Airflow 에서 start_date / execute_date 는 매우 헷갈리는 개념이다.
- start_date : DAG 스케쥴이 시작되는 시간(날짜)
- execution_date : 스케쥴을 한시간에 한번이라면, DAG 실행 한시간 전에 대한 시간
- 모든 문서에서 보면, execution_date를 date로 받아들이지 말고, dag 의 고유 실행 id 로 받아들이라고 한다.
- 그런 의미에서, 추후에 backfill 을 하더라도, 즉 나중에 해당 dag를 다시 실행하더라도 execution_date는 그대로 유지 된다.
2. 스케쥴링 테스트
1. catchup = False , schedule_interval = '*/15 * * * *'
- code
dag = DAG(
dag_id='date_test_dag_v1',
start_date=datetime(2022, 4, 1, tzinfo=korea_tz),
catchup=False,
schedule_interval='*/15 * * * *'
)
- DAG 업로드 시간 : 2022.04.21 10:05
- DAG 반복 주기 : 15분에 한번씩
- CATCH UP : False
- False 이기 때문에, 업로드 당시, 재시작 당시 한번만 DAG 실행 되며, 그 이전에 대한 DAG는 실행 되지 않음
- 멈췄다가 재 실행하더라도, 이전 DAG를 실행 x
2. catchup = True , schedule_interval = '*/60 * * * *'
- code
dag = DAG(
dag_id='date_test_dag_v2',
start_date=datetime(2022, 4, 20, tzinfo=local_tz),
catchup=True,
schedule_interval='*/60 * * * *',
default_args={
'retries': 1,
'retry_delay': timedelta(minutes=3)
}
)
- DAG 업로드 시간 : 2022.04.21 15:59
- DAG 반복 주기 : 1시간에 한번씩
- CATCH UP : True
- True 이기 때문에, 업로드 당시, 4월 20일 3시 DAG부터 한번에 25개가 실행 됨. ( 순서대로 실행되기 때문에, 시간차 존재하긴 함. 그러나 한번에 켜짐 )
- 사실 DAG 는 25개나, 한번에 켜지기때문에 느려져 재 실행되고, 그래서 Runs가 40개가 찍히는것으로 보인다.
- 멈췄다가 다시 실행할 때, 역시 멈춘동안 돌지 못한 DAG 도 함께 실행된다.
- True 이기 때문에, 업로드 당시, 4월 20일 3시 DAG부터 한번에 25개가 실행 됨. ( 순서대로 실행되기 때문에, 시간차 존재하긴 함. 그러나 한번에 켜짐 )
- 특이점 : 4월 20일이라고 설정하더라도 00시부터 시작하는 것이 아니라, 4시에 돌아가는 3시부터 시작되는 것으로 보인다.
3. Catch up 을 설정했을 때(True)와 아닐 때(False), 가져올 데이터를 어떻게 구별하는가?
Q. Backfill 을 실행하여 ‘과거 데이터’만을 가져오거나 ?! 혹은 Catch up을 하여 이전 DAG를 실행하여 ‘이전 데이터’를 가져온다!? 그렇다면, ‘이전 데이터’라는 것은 어떻게 아는가?!
A. execution_date 를 사용하여, 코드에 날짜 조건을 걸어주어 사용한다.
실제, 코드가 전체 데이터를 가져와서 사용하는 경우 ( 혹은 날짜와 관련 없는 데이터의 경우 ) 에는 catch up 설정 혹은 backfill 에 대해서 신경쓰지 않아도 되는 것으로 보인다.
즉, 여러번 실행 했을 때나, 한번만 실행 했을 때나 DAG 실행 당시까지 쌓인 전체 데이터를 가져와서 처리한다.
그러나, execution_date 가 의미가 있으려면, execution_date로 코드 상에서 조건을 걸어주어 해당 날짜 이후 데이터 혹은 이전의 데이터를 가져오는 식으로 사용한다.
- 변수로 받는 DATE 는 execute date 만 가능하다.
4. DAG 가 에러가 나온다면? execution_date는 어떻게 되는가?
그냥 무시하고 증가된다. 따라서 execution_date 를 이용하려면 처리가 필요해 보인다.
→ 그래서 backfill 이라는 개념이 편하게 동작되는 것으로 보인다.