프로젝트: Airflow를 이용한 데이터 파이프라인
프로젝트 설명: 한 음악 스트리밍 회사가 데이터 웨어하우스 ETL(Extract, Transform, Load) 파이프라인에 더 많은 자동화와 모니터링을 도입하고자 합니다. 그들은 이를 달성하는 가장 좋은 도구는 Apache Airflow라는 결론에 이르렀습니다. 저는 이 회사에서 데이터 엔지니어 역할을 맡았고, 데이터 품질 검사를 통합하고 쉬운 백필(backfill)이 가능한 재사용 가능한 프로덕션급 데이터 파이프라인을 구축하는 임무를 받았습니다. 여러 분석가와 데이터 과학자들이 이 파이프라인의 결과물에 의존하며, 이 파이프라인은 소스에서 새 데이터를 가져와 목적지에 결과를 저장하도록 매일 스케줄링되어 실행될 것으로 예상됩니다.
데이터 설명: 소스 데이터는 S3에 존재하며 Amazon Redshift라는 데이터 웨어하우스에서 처리되어야 합니다. 소스 데이터셋은 애플리케이션의 사용자 활동에 대한 JSON 로그와 사용자가 듣는 노래에 대한 JSON 메타데이터로 구성됩니다.
데이터 파이프라인 설계:
전반적으로 이 파이프라인은 다음과 같은 작업을 수행합니다.
- 여러 S3 위치에서 데이터를 추출(Extract)합니다.
- 데이터를 Redshift 클러스터에 적재(Load)합니다.
- 데이터를 스타 스키마(star schema)로 변환(Transform)합니다.
- 데이터 유효성 검사 및 데이터 품질 검사를 수행합니다.
- 지정된 시간 간격 동안 가장 많이 재생된 노래를 계산합니다.
- 결과를 다시 S3에 적재합니다.
dag
Airflow DAG의 구조
설계 목표:
데이터 소비자들의 요구 사항을 바탕으로, 우리의 파이프라인은 다음 지침을 준수해야 합니다:
- DAG는 과거 실행에 대한 의존성이 없어야 합니다.
- 실패 시 작업(task)은 3회 재시도됩니다.
- 재시도는 5분마다 발생합니다.
- Catchup 기능은 비활성화됩니다.
- 재시도 시 이메일을 보내지 않습니다.
파이프라인 구현:
Apache Airflow는 DAG(Directed Acyclic Graph) 내에서 워크플로우를 프로그래밍 방식으로 생성하기 위한 Python 프레임워크입니다. 예를 들어, ETL 프로세스 실행, 보고서 생성, 모델 일일 재학습 등이 가능합니다. Airflow UI는 우리가 정의한 DAG를 자동으로 파싱하여 데이터의 이동 및 변환에 대한 자연스러운 표현을 만들어줍니다. DAG란 여러분이 실행하고자 하는 모든 태스크들의 모음이며, 이들이 갖는 관계와 의존성을 반영하는 방식으로 구성됩니다. DAG는 워크플로우를 어떻게 수행할지(how)를 설명하고, Operators는 실제로 무엇을 수행할지(what)를 결정합니다.
기본적으로 Airflow에는 PythonOperator, BashOperator, DummyOperator 등 몇 가지 간단한 내장 Operator가 제공되지만, Airflow는 BaseOperator의 기능을 확장하여 사용자 정의 Operator를 만들 수 있도록 합니다. 이 프로젝트에서는 여러 개의 커스텀 Operator를 개발했습니다.
operators
각 Operator에 대한 설명은 다음과 같습니다:
- StageToRedshiftOperator: 지정된 S3 위치에서 특정 Redshift 클러스터로 데이터를 스테이징합니다. 이 Operator는 템플릿 필드를 사용하여 파티션화된 S3 위치를 처리합니다.
- LoadFactOperator: 제공된 SQL 문을 실행하여 주어진 Fact 테이블에 데이터를 로드합니다. 삭제-삽입(delete-insert) 방식과 추가(append) 방식의 로드를 지원합니다.
- LoadDimensionOperator: 제공된 SQL 문을 실행하여 주어진 Dimension 테이블에 데이터를 로드합니다. 삭제-삽입(delete-insert) 방식과 추가(append) 방식의 로드를 지원합니다.
- SubDagOperator: 두 개 이상의 Operator를 SubDagOperator를 사용하여 하나의 태스크로 그룹화할 수 있습니다. 여기서는 주어진 테이블에 행이 있는지 확인하는 작업과 일련의 데이터 품질 SQL 명령을 실행하는 작업을 그룹화했습니다.
- HasRowsOperator: 지정된 테이블에 행이 있는지 확인하는 데이터 품질 검사입니다.
- DataQualityOperator: 데이터를 검증하기 위해 SQL 문을 실행하여 데이터 품질 검사를 수행합니다.
- SongPopularityOperator: 주어진 간격(interval) 동안 가장 인기 있는 상위 10개 노래를 계산합니다. 이 간격은 DAG 스케줄에 의해 결정됩니다.
- UnloadToS3Operator: 분석 결과를 주어진 S3 위치로 다시 저장합니다.
이러한 각 오퍼레이터의 코드는 plugins/operators 디렉토리에 위치합니다.
파이프라인 스케줄 및 데이터 파티셔닝:
S3에 있는 이벤트 데이터는 연도(2018)와 월(11)로 파티셔닝되어 있습니다. 우리의 임무는 이벤트 json 파일을 증분적으로 로드하고, 이를 전체 파이프라인을 통해 실행하여 노래의 인기도를 계산한 후 그 결과를 다시 S3에 저장하는 것입니다. 이런 방식으로 우리는 파이프라인을 사용하여 매일 최고의 노래들을 자동화된 방식으로 얻을 수 있습니다. 참고로 이것은 사소한 분석이지만, 비슷한 구조를 따르는 다른 복잡한 쿼리들도 상상할 수 있습니다.
S3 입력 이벤트 데이터:
s3://<bucket>/log_data/2018/11/
2018-11-01-events.json
2018-11-02-events.json
...
S3 출력 노래 인기도 데이터:
s3://skuchkula-topsongs/
songpopularity_2018-11-01
songpopularity_2018-11-02
...
DAG는 start_date, end_date 및 위에서 언급한 다른 설계 선택 사항을 지정하는 일부 default_args를 제공함으로써 구성할 수 있습니다.
default_args = {
'owner': 'shravan',
'start_date': datetime(2018, 11, 1),
...
이 프로젝트 실행 방법?
단계 1: 콘솔 또는 create-redshift-cluster의 노트북을 통해 AWS Redshift 클러스터 생성
AWS Redshift 클러스터를 생성하려면 노트북을 실행하세요. 다음 사항에 유의하세요:
- DWN_ENDPOINT :: dwhcluster.c4m4dhrmsdov.us-west-2.redshift.amazonaws.com
- DWH_ROLE_ARN :: arn:aws:iam::506140549518:role/dwhRole
단계 2: Apache Airflow 시작
docker-compose.yml이 포함된 디렉토리에서 docker-compose up을 실행하세요. DAG가 있는 위치를 가리키도록 볼륨 매핑을 했는지 확인하십시오.
참고: Mac에서 Apache Airflow를 관리하는 방법에 대한 자세한 내용은 여기에서 찾을 수 있습니다: https://gist.github.com/shravan-kuchkula/a3f357ff34cf5e3b862f3132fb599cf3
start_airflow
단계 3: Apache Airflow Hook 구성
왼쪽에는 S3 connection이 있습니다. 로그인(Login)과 비밀번호(password)는 생성한 IAM 사용자의 액세스 키와 시크릿 키입니다. 기본적으로 이 자격 증명(credentials)을 사용하여 S3에서 데이터를 읽어올 수 있습니다.
오른쪽은 redshift connection입니다. 이 값들은 Redshift 클러스터에서 쉽게 얻을 수 있습니다.
connections
4단계: create-tables-dag 실행
이 DAG는 스테이징(staging), 팩트(fact) 및 디멘션(dimension) 테이블을 생성할 것입니다. 이 작업을 수동으로 트리거해야 하는 이유는 메인 DAG에서 분리하고 싶기 때문입니다. 일반적으로 테이블 생성은 스크립트를 트리거하는 것만으로 처리될 수 있습니다. 하지만 설명의 목적으로 제가 이를 위한 DAG를 만들고 Airflow가 그 DAG를 트리거하도록 했습니다. 이 DAG는 완료되면 비활성화할 수 있습니다. 이 DAG를 실행한 후에는 AWS Redshift에 모든 테이블이 생성된 것을 확인할 수 있어야 합니다.
5단계: load_and_transform_data_in_redshift dag 활성화
실행 시작 날짜(execution start date)가 2018-11-01이고 스케줄 간격(schedule interval)이 @daily이며 실행 종료 날짜(execution end date)가 2018-11-30이기 때문에, Airflow는 30회 동안 매일 자동으로 DAG를 트리거하고 예약할 것입니다. 아래에는 start_date부터 end_date까지, Airflow에 의해 하루에 한 번씩 트리거된 30개의 DAG 실행(DAG runs)이 표시되어 있습니다.
schedule