학습내용
airflow와 타임존
- airflow.cfg에는 두 종류의 타임존 관련 키가 존재
1. default_timezone
2. default_ui_timezone
- start_date,end_date,schedule
- dafault_timezone에 저장된 타임존을 따른다
- execution_date와 로그시간
- 항상 UTC를 따른다.
- execution_date를 사용할때는 타임존을 고려해서 변환후 사용이 필요하다
=> UTC를 일관되게 사용하는 것이 좋다.
dags 폴더에서 코딩시 주의점
- dags 폴더를 주기적으로 스캔하기 때문에 본의 아니게 개발중인 테스트코드가 실행될 수 있다.
Primary Key Uniqueness란?
- 테이블에서 하나의 레코드를 유일하게 지칭할 수 있는 필드
- 일반적으로 하나의 필드를 사용하지만 다수의 필드를 사용할 수도 있다.
- 이를 CREATE TABLE 사용시 지정
- 관계형 데이터베이스 시스템이 primary KEY의 값이 중복 존재하는 것을 막아준다.
- 빅데이터 기반 데이터 웨어하우스들은 Primary key를 보장하는데 메모리와 시간이 더 들기 때문에 유일성을 보장해주지 않는다.
=> 사용자가 주의해야 한다.
ex) ROW_NUMBER 같은 함수 사용
Primary Key 유지방법
- 임시 테이블을 만들고 거기로 현재 모든 레코드를 복사
- 임시 테이블에 새로운 데이터소스에서 읽어들인 레코드들을 복사
- 이 때 중복이 존재 가능
- 중복을 걸러주는 SQL 작성
- 최신 레코드를 우선 순위로 선택
- ROW_NUMBER를 이용해서 primary key로 partition을 잡고 적당한 다른 필드(보통 타임스탬프 필드)로 ordering(역순 DESC)을 수행해 primary key별로 하나의 레코드를 잡아냄
- 위의 SQL문을 바탕으로 최종 원본 테이블로 복사
- 이 때 원본 테이블에서 레코드들을 삭제
- 임시 temp테이블을 원본 테이블로 복사
Upsert란?
- Primary Key를 기준으로 존재하는 레코드라면 새 정보로 수정
- 존재하지 않는 레코드라면 새 레코드로 적재
- 보통 데이터 웨어하우스마다 UPSERT를 효율적으로 해주는 문법을 지원한다
Backfill의 용이성 여부
- Backfill : 실패한 데이터 파이프라인을 재실행 혹은 읽어온 데이터들의 문제로 다시 다 읽어와야하는 경우를 의미
- Backfill의 해결은 Incremental Update에서 복잡해진다.
- Full Refresh에서는 간단하다, 그냥 재실행하면 됨
- 즉 실패한 데이터 파이프라인의 재실행이 얼마나 용이한 구조인가?
- 이게 잘 디자인된 것이 바로 Airflow
어떻게 ETL을 구현하면 이런 일이 편해질까?
- 시스템적으로 쉽게 해주는 방법을 구현한다.
- 날짜별로 Backfill 결과를 기록하고 성공여부 기록: 나중에 결과를 쉽게 확인가능
- 이 날짜를 시스템에서 ETL의 인자로 제공
- 데이터 엔지니어는 읽어와야하는 데이터의 날짜를 계산하지 않고 시스템이 지정해준 날짜를 사용
- Airflow의 접근방식
- ETL 별로 실행날짜와 결과를 메타데이터 데이터베이스에 기록
- 모든 DAG실행에는 "exectuion_date"이 지정되어있다.
- execution_date으로 채워야하는 날짜와 시간이 넘어온다.
- 이를 바탕으로 데이터를 갱신하도록 코드를 작성해야한다.
- 잇점 : Backfill이 쉬워짐
Backfill과 관련된 Airflow변수들
start_date = DAG가 처음 읽어와야하는 데이터의 날짜/시간. 실제 첫 실행날짜는 start_date + DAG의 실행주기
(DAG가 처음 실행되는 날짜가 아니다!!)
execution_date = DAG가 읽어와야하는 데이터의 날짜와 시간
catchup : DAG가 처음 활성화된 시점이 start_date보다 ㅣ래라면 그 사이에 실행이 안된 것들을 어떻게할 것인지 결정해주는 파라미터. True가 디폴트값이고 이 경우 실행안된 것들을 모두 따라잡으려고함. False가 되면 실행 안된것들을 무시한다.
end_date : 이 값은 보통 필요하지 않으며 Backfill을 날짜 범위에 대해 하는 경우에만 필요