SlideShare a Scribd company logo
1 of 40
Download to read offline
EXTENDED SEOUL
BigQuery Data Lake
& Airflow Contribution
Jay Kim kjh3477@gmail.com
EXTENDED SEOUL
Agenda
● 빅쿼리 도입 계기
● 빅쿼리 도입을 위한 과제들
● 데이터 파이프라인 구축을 위한 고민들
● Airflow 간단 소개
● Airflow 기반 데이터 파이프라인
● 여러가지 이슈들, 오픈소스 참여
● 마무리
EXTENDED SEOUL
2016년 12월 리니지2 레볼루션 오픈
기존 전체 처리량을 상회하는 수준의 데이터 유입
→ RDB 기반 단일 머신 환경에서의 집계가 어려운 상황
빠르게 구글 빅쿼리를 도입하여 문제 해결!
빅쿼리 도입 계기
EXTENDED SEOUL
빅쿼리 도입을 위한 과제들
국가 간 전송
● 보다 효율적인 전송 필요
대용량 마이그레이션
● 아웃바운드 트래픽 발생에 따라 처리 방식이 달라져야함
● 기존, IDC 내부에서만 데이터 이동 → 변경 후, 외부 서버로의 트래픽 발생
예상치 못한 빅쿼리 이슈들
● 빅쿼리 사용량 제한 정책
● 타입 호환성
EXTENDED SEOUL
넷마블 IDC - 구글 GCS 서버 압축 전송, 구글 GCS - BigQuery 로드
넷마블 IDC GCS 빅쿼리
빅쿼리 도입을 위한 과제들 : 국가 간 전송
gzip
EXTENDED SEOUL
데이터 세그먼트 별 분산/병렬 처리, 처리 스테이지 별 동시성 제어 (특히 동시 전송 수)
빅쿼리 도입을 위한 과제들 : 대용량 마이그레이션
EXTENDED SEOUL
빅쿼리 간헐적 실패 케이스 대응
● 빅쿼리 사용량 제한 정책에 의해 실패하는 케이스 대응
그 밖에..
● 기존 데이터 타입의 빅쿼리 호환성 고민 (호환성 관련 깨짐/누락)
● 빅쿼리 파티션 기능 부재에 따른 재처리 방식 고민
빅쿼리 도입을 위한 과제들 : 예상치 못한 빅쿼리 이슈들
EXTENDED SEOUL
기존에 크론 기반으로 ETL이 구성되어 있었으나 확장된 요구사항을 수용하기 어려움
데이터 파이프라인 구축을 위한 고민들 : ASIS
EXTENDED SEOUL
실행 순서 / 동시성 제어 / 처리 결과에 따른 분기 처리를 위해 스크립트를 구현하면?
→ 복잡해질 뿐더러 모니터링도 안되고, 관리하기도 어려움
→ 스케줄러를 이용하자! ( Avoid reinventing the wheel ! )
데이터 파이프라인 구축을 위한 고민들 : TOBE
EXTENDED SEOUL
전송 효율화를 위한 압축 절차 추가
● 새로운 절차가 추가될 때 유연하게 기존 코드를 연동
대용량 마이그레이션을위한 파이프라인 고도화
● 여러 장비에 분산 / 병렬 처리할 때 모니터링 및 컨트롤 가능
● 스테이지 별로 동시성을 제어하면서 각 파이프라인을 순차적으로 실행 가능
예상치 못한 빅쿼리 이슈들에 대한 처리 자동화
● 리턴 코드에 따라 그냥 재실행 해서 해소 가능
● 해소 불가인 경우 오퍼레이터에게알람
가볍지만 확장성 있는 Airflow
EXTENDED SEOUL
Airflow 간단 소개 : 컨셉
Airflow : 워크플로우 (일의 진행 과정/흐름) 관리 플랫폼
간단한 파이썬 프로그래밍을 통해 데이터 파이프라인을 구성 / 스케줄링 / 모니터링
EXTENDED SEOUL
Airflow 간단 소개 : 구성 및 흐름도
EXTENDED SEOUL
Airflow 간단 소개 : 스케줄 생성
EXTENDED SEOUL
Airflow 간단 소개 : 스케줄 생성
EXTENDED SEOUL
Airflow 간단 소개 : 진행 현황 확인
EXTENDED SEOUL
Airflow 간단 소개 : 지연 태스크 확인
EXTENDED SEOUL
Airflow 간단 소개 : 이슈 분석
EXTENDED SEOUL
기존에 크론으로 돌던 많은 스크립트들을 개발 소요 없이 스케줄러와 연동하고 싶음
● 크론으로 수행되던 커맨드 → Airflow 의 DAG 을 구성
● DAG 형식으로 여러 커맨드 간 의존성 및 특정 커맨드의 동시 수행 수 관리
Airflow 기반 데이터 파이프라인 : 크론 제거
EXTENDED SEOUL
과거 재처리를 기존 모듈로 파라미터만 변경하며 수행하고 싶음
● 커맨드에 datetime 파라미터 주입하는 기능 추가
● 스케줄러의 execution_date 값 기반으로 여러 과거 스케줄 자동 생성
Airflow 기반 데이터 파이프라인 : 태스크 자동 생성
EXTENDED SEOUL
많은 수의 재처리들 중 실패 발생을 쉽게 확인하고, 자동 대응할 수 있도록 하고 싶음
● return code 에 따라 재시도 하거나 특정 하위 태스크만을 수행함
● 실패 시 메시지 전송
Airflow 기반 데이터 파이프라인 : 분기 처리
{
...
branching: {
cmd: "blah", upstream: [run_this_first],
branch: { _0: branch_a, _1: branch_false}
},
branch_a: {cmd: "blah", upstream: [branching] },
branch_false: {cmd: "blah", upstream: [branching] },
...
}
EXTENDED SEOUL
기존 프로세스와의 오케스트레이션
● 트리거/센서 기능을 이용하여 여러 종류의 스케줄을 연동
Airflow 기반 데이터 파이프라인 : 오케스트레이션
sensor trigger
Other Schedules
EXTENDED SEOUL
유사한 코드를 반복적으로 작성하면 시간도 오래 걸리고 실수할 가능성도 있음
● 정말 최소한의 설정만 작성하고, 나머지는 자동으로 완성해주는 무언가가 필요 !
Airflow 기반 데이터 파이프라인 : 운영 효율화
EXTENDED SEOUL
Airflow 기반 데이터 파이프라인 : Task Builder
넷마블 데이터인프라팀운영 효율화를 위한 내부 프로젝트
● json 형식 (자체 포맷) 으로 정의된 스케줄을 읽어서 Airflow 스케줄을 자동 생성
EXTENDED SEOUL
가끔 예상치 못한 문제들이 발생할 수 있으므로 그 구조를 이해한 후 대응해야 함
여러가지 이슈들, 오픈소스 참여
EXTENDED SEOUL
여러가지 이슈들, 오픈소스 참여
버그
● Airflow 내부적인 버그들은 소스 분석 후 수정
**Appendix. Airflow Issues
성능 이슈
● Airflow 스케줄링 또는 웹 뷰 출력 단계에서의 지연 이슈 해소
특정 조건의 task instance 를 쿼리할 때 slow query 발생하는 부분 개선
사용성 이슈
● Airflow 에서 다소 직관적이지 않거나 운영 상 비효율적인 부분들도 수정
clear -f 실행 시 upstream_failed 는 처리되지 않는 이슈 해소
EXTENDED SEOUL
코드 수정 내용 중 일부는 contribution 함
여러가지 이슈들, 오픈소스 참여
EXTENDED SEOUL
빅쿼리 대용량 마이그레이션 및 빅쿼리 오퍼레이션 연동 시 Airflow 사용을 검토해보자
Airflow 사용할 때 버그 또는 예상과 다른 행동에 대한 대응책을 마련하여 사용하자
Airflow 소스를 분석해보면 운영에 도움이 된다 !
마무리
EXTENDED SEOUL
Q & A
EXTENDED SEOUL
빅쿼리 오퍼레이션이 지연되는 케이스 대응 필요
● job status 를 폴링하며, pending → running 으로 넘어가서 done 되는지 확실하게 처리할 것
빅쿼리 사용량 제한 정책에 따른 다양한 실패 케이스들
● https://cloud.google.com/bigquery/quotas
● https://cloud.google.com/bigquery/troubleshooting-errors
● slot limitation
● concurrent update limitation
○ Exceeded rate limits: too many table update operations for this table. For more
information, see https://cloud.google.com/bigquery/troubleshooting-errors
Appendix. Bigquery Issues
EXTENDED SEOUL
Update state deadlock issue :
아래 에러 메시지를 동반한 스케줄러 다운 / 태스크 실패
‘Deadlock found when trying to get lock; try restarting transaction’
1. change_state_for_tis_without_dagrun 과정에서 발생하면 스케줄러 다운
2. _check_and_change_state_before_execution 과정에서 발생하면 태스크 실패
Limbo task issue :
특정 태스크가 실패한 이후 downstream 노드들이 실행되지 않고 스케줄이 종료됨
Leaf-less backfill not working :
완료된 스케줄의 중간 노드만 clear 시 해당 노드가 실행되지 않고 종료됨
Stuck in queued state issue :
태스크가 queued 상태에서 running 으로 전환되지 않음
Appendix. Airflow Issues
EXTENDED SEOUL
Update state deadlock issue
● 발생 원인 :
○ 스케줄러, 워커, 매뉴얼 조작 간 race condition
○ 동일 task instance에 대한 상태 변경 시도가 발생할 수 있는 구조적 문제
(Appendix. Airflow Scheduler, Appendix. Airflow Worker 페이지 보라색 동그라미 참조)
● 1.8 버그로 확인됨
● 1.10에서도 해소 안됨 (커뮤니티 내에서 구조적 문제를 개선하고자 하고 있음)
● 우회 방법
○ 문제의 쿼리 코드에서 위 에러를 catch 하여 롤백 후 재시도하도록 소스 수정함
Appendix. Airflow Issues
EXTENDED SEOUL
Limbo task issue
● 발생 원인 :
○ cut vertex 노드가 실패하고, 해당 노드가 all_success 트리거 룰을 가진 child 만 가진 경우
스케줄러가 해당 스케줄을 종료시킴 (Appendix. Airflow Cut Vertex 페이지 참조)
● 1.8 버그로 확인됨
● 1.10에서 해소됨
● 우회 방법
○ cut vertex에 dependency가 없는 leaf에 대한 sensor 노드를 추가
(최종 노드가 완료될 때까지 스케줄 종료를 막음)
Appendix. Airflow Issues
EXTENDED SEOUL
Limbo task issue
● 발생 원인 :
○ cut vertex 노드가 실패하고, 해당 노드가 all_success 트리거 룰을 가진 child 만 가진 경우
스케줄러가 해당 스케줄을 종료시킴 (Appendix. Cut Vertex 페이지 참조)
● 1.8 버그로 확인됨
● 1.10에서 해소됨
● 우회 방법
○ cut vertex에 dependency가 없는 leaf에 대한 sensor 노드를 추가
(최종 노드가 완료될 때까지 스케줄 종료를 막음)
Appendix. Airflow Issues
EXTENDED SEOUL
Leaf-less backfill not working
● 발생 원인 :
○ 스케줄러가 runnable 한 leaf 노드가 없는 스케줄을 종료시킴
● 1.8 버그로 확인됨
● 1.10에서 해소됨
● 우회 방법
○ 재처리 하고자 하는 중간 노드에 leaf 인 child 노드를 추가한 후 clear
Appendix. Airflow Issues
EXTENDED SEOUL
Stuck in queued state issue
● 발생 원인 :
○ 스케줄러가 dag import 과정에서 timeout 으로 실패한 경우 이를 해소하지 않고 방치함
● 1.8 버그로 확인됨
● 1.9 이후로 해소됨
● 우회 방법
○ 설정 중 dagbag_import_timeout 값을 충분히 큰 값으로 지정해 줌
Appendix. Airflow Issues
EXTENDED SEOUL
Appendix. Airflow Sequence Diagram (Scheduler)
EXTENDED SEOUL
Appendix. Airflow Sequence Diagram (Worker)
EXTENDED SEOUL
Appendix. Airflow Scheduler
EXTENDED SEOUL
Appendix. Airflow Worker
EXTENDED SEOUL
Appendix. Airflow Cut Vertex
제거 시 그래프가 복수의 컴포넌트로 분리되는 지점의 노드
● 아래 예시의 L2_CUT_VERTEX, L4_CUT_VERTEX
● Cut Vertex 는 해당 지점의 upstream 과 downstream을 잇는 유일한 지점
1.8 버전 버그 발생 조건
● L2_CUT_VERTEX 에서 failed
● L3_A, L3_B, L3_C 모두 all_success 트리거 룰로 세팅 되어 있음
● 스케줄러는 L2_CUT_VERTEX 실패 시 이하 노드를 수행할 필요가 없다고 판단하여 스케줄을 종료시킴 (만약 L4_CUT_VERTEX 가 all_done 룰이라면 의도하지 않은 동작임)

More Related Content

Similar to BigQuery Data Lake & Airflow Contribution

Opendaylight beryllium
Opendaylight berylliumOpendaylight beryllium
Opendaylight berylliumCheolmin Lee
 
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇BOAZ Bigdata
 
백기선의 스프링 부트
백기선의 스프링 부트백기선의 스프링 부트
백기선의 스프링 부트Keesun Baik
 
data platform on kubernetes
data platform on kubernetesdata platform on kubernetes
data platform on kubernetes창언 정
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...Amazon Web Services Korea
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기Minyoung Jeong
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCPDaegeun Kim
 
OpenFlow 1.5.1
OpenFlow 1.5.1OpenFlow 1.5.1
OpenFlow 1.5.1jungbh
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in actionBingu Shim
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
OCI Database Management 설정 방법
OCI Database Management 설정 방법OCI Database Management 설정 방법
OCI Database Management 설정 방법JC Park
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준NAVER D2
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나JeongHwan Kim
 
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable FunctionsJongin Lee
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례if kakao
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501Suho Kwon
 
클린아키텍처와 DDD - day1
클린아키텍처와 DDD - day1클린아키텍처와 DDD - day1
클린아키텍처와 DDD - day1Chimin Park
 
Configuration management best practices
Configuration management best practicesConfiguration management best practices
Configuration management best practicesHyunil Shin
 
ALM과 DevOps 그리고 Azure DevOps
ALM과 DevOps 그리고 Azure DevOpsALM과 DevOps 그리고 Azure DevOps
ALM과 DevOps 그리고 Azure DevOpsTaeyoung Kim
 

Similar to BigQuery Data Lake & Airflow Contribution (20)

Opendaylight beryllium
Opendaylight berylliumOpendaylight beryllium
Opendaylight beryllium
 
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
 
NO PARALLEL DML
NO PARALLEL DMLNO PARALLEL DML
NO PARALLEL DML
 
백기선의 스프링 부트
백기선의 스프링 부트백기선의 스프링 부트
백기선의 스프링 부트
 
data platform on kubernetes
data platform on kubernetesdata platform on kubernetes
data platform on kubernetes
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCP
 
OpenFlow 1.5.1
OpenFlow 1.5.1OpenFlow 1.5.1
OpenFlow 1.5.1
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in action
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
OCI Database Management 설정 방법
OCI Database Management 설정 방법OCI Database Management 설정 방법
OCI Database Management 설정 방법
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501
 
클린아키텍처와 DDD - day1
클린아키텍처와 DDD - day1클린아키텍처와 DDD - day1
클린아키텍처와 DDD - day1
 
Configuration management best practices
Configuration management best practicesConfiguration management best practices
Configuration management best practices
 
ALM과 DevOps 그리고 Azure DevOps
ALM과 DevOps 그리고 Azure DevOpsALM과 DevOps 그리고 Azure DevOps
ALM과 DevOps 그리고 Azure DevOps
 

BigQuery Data Lake & Airflow Contribution

  • 1. EXTENDED SEOUL BigQuery Data Lake & Airflow Contribution Jay Kim kjh3477@gmail.com
  • 2. EXTENDED SEOUL Agenda ● 빅쿼리 도입 계기 ● 빅쿼리 도입을 위한 과제들 ● 데이터 파이프라인 구축을 위한 고민들 ● Airflow 간단 소개 ● Airflow 기반 데이터 파이프라인 ● 여러가지 이슈들, 오픈소스 참여 ● 마무리
  • 3. EXTENDED SEOUL 2016년 12월 리니지2 레볼루션 오픈 기존 전체 처리량을 상회하는 수준의 데이터 유입 → RDB 기반 단일 머신 환경에서의 집계가 어려운 상황 빠르게 구글 빅쿼리를 도입하여 문제 해결! 빅쿼리 도입 계기
  • 4. EXTENDED SEOUL 빅쿼리 도입을 위한 과제들 국가 간 전송 ● 보다 효율적인 전송 필요 대용량 마이그레이션 ● 아웃바운드 트래픽 발생에 따라 처리 방식이 달라져야함 ● 기존, IDC 내부에서만 데이터 이동 → 변경 후, 외부 서버로의 트래픽 발생 예상치 못한 빅쿼리 이슈들 ● 빅쿼리 사용량 제한 정책 ● 타입 호환성
  • 5. EXTENDED SEOUL 넷마블 IDC - 구글 GCS 서버 압축 전송, 구글 GCS - BigQuery 로드 넷마블 IDC GCS 빅쿼리 빅쿼리 도입을 위한 과제들 : 국가 간 전송 gzip
  • 6. EXTENDED SEOUL 데이터 세그먼트 별 분산/병렬 처리, 처리 스테이지 별 동시성 제어 (특히 동시 전송 수) 빅쿼리 도입을 위한 과제들 : 대용량 마이그레이션
  • 7. EXTENDED SEOUL 빅쿼리 간헐적 실패 케이스 대응 ● 빅쿼리 사용량 제한 정책에 의해 실패하는 케이스 대응 그 밖에.. ● 기존 데이터 타입의 빅쿼리 호환성 고민 (호환성 관련 깨짐/누락) ● 빅쿼리 파티션 기능 부재에 따른 재처리 방식 고민 빅쿼리 도입을 위한 과제들 : 예상치 못한 빅쿼리 이슈들
  • 8. EXTENDED SEOUL 기존에 크론 기반으로 ETL이 구성되어 있었으나 확장된 요구사항을 수용하기 어려움 데이터 파이프라인 구축을 위한 고민들 : ASIS
  • 9. EXTENDED SEOUL 실행 순서 / 동시성 제어 / 처리 결과에 따른 분기 처리를 위해 스크립트를 구현하면? → 복잡해질 뿐더러 모니터링도 안되고, 관리하기도 어려움 → 스케줄러를 이용하자! ( Avoid reinventing the wheel ! ) 데이터 파이프라인 구축을 위한 고민들 : TOBE
  • 10. EXTENDED SEOUL 전송 효율화를 위한 압축 절차 추가 ● 새로운 절차가 추가될 때 유연하게 기존 코드를 연동 대용량 마이그레이션을위한 파이프라인 고도화 ● 여러 장비에 분산 / 병렬 처리할 때 모니터링 및 컨트롤 가능 ● 스테이지 별로 동시성을 제어하면서 각 파이프라인을 순차적으로 실행 가능 예상치 못한 빅쿼리 이슈들에 대한 처리 자동화 ● 리턴 코드에 따라 그냥 재실행 해서 해소 가능 ● 해소 불가인 경우 오퍼레이터에게알람 가볍지만 확장성 있는 Airflow
  • 11. EXTENDED SEOUL Airflow 간단 소개 : 컨셉 Airflow : 워크플로우 (일의 진행 과정/흐름) 관리 플랫폼 간단한 파이썬 프로그래밍을 통해 데이터 파이프라인을 구성 / 스케줄링 / 모니터링
  • 12. EXTENDED SEOUL Airflow 간단 소개 : 구성 및 흐름도
  • 13. EXTENDED SEOUL Airflow 간단 소개 : 스케줄 생성
  • 14. EXTENDED SEOUL Airflow 간단 소개 : 스케줄 생성
  • 15. EXTENDED SEOUL Airflow 간단 소개 : 진행 현황 확인
  • 16. EXTENDED SEOUL Airflow 간단 소개 : 지연 태스크 확인
  • 17. EXTENDED SEOUL Airflow 간단 소개 : 이슈 분석
  • 18. EXTENDED SEOUL 기존에 크론으로 돌던 많은 스크립트들을 개발 소요 없이 스케줄러와 연동하고 싶음 ● 크론으로 수행되던 커맨드 → Airflow 의 DAG 을 구성 ● DAG 형식으로 여러 커맨드 간 의존성 및 특정 커맨드의 동시 수행 수 관리 Airflow 기반 데이터 파이프라인 : 크론 제거
  • 19. EXTENDED SEOUL 과거 재처리를 기존 모듈로 파라미터만 변경하며 수행하고 싶음 ● 커맨드에 datetime 파라미터 주입하는 기능 추가 ● 스케줄러의 execution_date 값 기반으로 여러 과거 스케줄 자동 생성 Airflow 기반 데이터 파이프라인 : 태스크 자동 생성
  • 20. EXTENDED SEOUL 많은 수의 재처리들 중 실패 발생을 쉽게 확인하고, 자동 대응할 수 있도록 하고 싶음 ● return code 에 따라 재시도 하거나 특정 하위 태스크만을 수행함 ● 실패 시 메시지 전송 Airflow 기반 데이터 파이프라인 : 분기 처리 { ... branching: { cmd: "blah", upstream: [run_this_first], branch: { _0: branch_a, _1: branch_false} }, branch_a: {cmd: "blah", upstream: [branching] }, branch_false: {cmd: "blah", upstream: [branching] }, ... }
  • 21. EXTENDED SEOUL 기존 프로세스와의 오케스트레이션 ● 트리거/센서 기능을 이용하여 여러 종류의 스케줄을 연동 Airflow 기반 데이터 파이프라인 : 오케스트레이션 sensor trigger Other Schedules
  • 22. EXTENDED SEOUL 유사한 코드를 반복적으로 작성하면 시간도 오래 걸리고 실수할 가능성도 있음 ● 정말 최소한의 설정만 작성하고, 나머지는 자동으로 완성해주는 무언가가 필요 ! Airflow 기반 데이터 파이프라인 : 운영 효율화
  • 23. EXTENDED SEOUL Airflow 기반 데이터 파이프라인 : Task Builder 넷마블 데이터인프라팀운영 효율화를 위한 내부 프로젝트 ● json 형식 (자체 포맷) 으로 정의된 스케줄을 읽어서 Airflow 스케줄을 자동 생성
  • 24. EXTENDED SEOUL 가끔 예상치 못한 문제들이 발생할 수 있으므로 그 구조를 이해한 후 대응해야 함 여러가지 이슈들, 오픈소스 참여
  • 25. EXTENDED SEOUL 여러가지 이슈들, 오픈소스 참여 버그 ● Airflow 내부적인 버그들은 소스 분석 후 수정 **Appendix. Airflow Issues 성능 이슈 ● Airflow 스케줄링 또는 웹 뷰 출력 단계에서의 지연 이슈 해소 특정 조건의 task instance 를 쿼리할 때 slow query 발생하는 부분 개선 사용성 이슈 ● Airflow 에서 다소 직관적이지 않거나 운영 상 비효율적인 부분들도 수정 clear -f 실행 시 upstream_failed 는 처리되지 않는 이슈 해소
  • 26. EXTENDED SEOUL 코드 수정 내용 중 일부는 contribution 함 여러가지 이슈들, 오픈소스 참여
  • 27. EXTENDED SEOUL 빅쿼리 대용량 마이그레이션 및 빅쿼리 오퍼레이션 연동 시 Airflow 사용을 검토해보자 Airflow 사용할 때 버그 또는 예상과 다른 행동에 대한 대응책을 마련하여 사용하자 Airflow 소스를 분석해보면 운영에 도움이 된다 ! 마무리
  • 29. EXTENDED SEOUL 빅쿼리 오퍼레이션이 지연되는 케이스 대응 필요 ● job status 를 폴링하며, pending → running 으로 넘어가서 done 되는지 확실하게 처리할 것 빅쿼리 사용량 제한 정책에 따른 다양한 실패 케이스들 ● https://cloud.google.com/bigquery/quotas ● https://cloud.google.com/bigquery/troubleshooting-errors ● slot limitation ● concurrent update limitation ○ Exceeded rate limits: too many table update operations for this table. For more information, see https://cloud.google.com/bigquery/troubleshooting-errors Appendix. Bigquery Issues
  • 30. EXTENDED SEOUL Update state deadlock issue : 아래 에러 메시지를 동반한 스케줄러 다운 / 태스크 실패 ‘Deadlock found when trying to get lock; try restarting transaction’ 1. change_state_for_tis_without_dagrun 과정에서 발생하면 스케줄러 다운 2. _check_and_change_state_before_execution 과정에서 발생하면 태스크 실패 Limbo task issue : 특정 태스크가 실패한 이후 downstream 노드들이 실행되지 않고 스케줄이 종료됨 Leaf-less backfill not working : 완료된 스케줄의 중간 노드만 clear 시 해당 노드가 실행되지 않고 종료됨 Stuck in queued state issue : 태스크가 queued 상태에서 running 으로 전환되지 않음 Appendix. Airflow Issues
  • 31. EXTENDED SEOUL Update state deadlock issue ● 발생 원인 : ○ 스케줄러, 워커, 매뉴얼 조작 간 race condition ○ 동일 task instance에 대한 상태 변경 시도가 발생할 수 있는 구조적 문제 (Appendix. Airflow Scheduler, Appendix. Airflow Worker 페이지 보라색 동그라미 참조) ● 1.8 버그로 확인됨 ● 1.10에서도 해소 안됨 (커뮤니티 내에서 구조적 문제를 개선하고자 하고 있음) ● 우회 방법 ○ 문제의 쿼리 코드에서 위 에러를 catch 하여 롤백 후 재시도하도록 소스 수정함 Appendix. Airflow Issues
  • 32. EXTENDED SEOUL Limbo task issue ● 발생 원인 : ○ cut vertex 노드가 실패하고, 해당 노드가 all_success 트리거 룰을 가진 child 만 가진 경우 스케줄러가 해당 스케줄을 종료시킴 (Appendix. Airflow Cut Vertex 페이지 참조) ● 1.8 버그로 확인됨 ● 1.10에서 해소됨 ● 우회 방법 ○ cut vertex에 dependency가 없는 leaf에 대한 sensor 노드를 추가 (최종 노드가 완료될 때까지 스케줄 종료를 막음) Appendix. Airflow Issues
  • 33. EXTENDED SEOUL Limbo task issue ● 발생 원인 : ○ cut vertex 노드가 실패하고, 해당 노드가 all_success 트리거 룰을 가진 child 만 가진 경우 스케줄러가 해당 스케줄을 종료시킴 (Appendix. Cut Vertex 페이지 참조) ● 1.8 버그로 확인됨 ● 1.10에서 해소됨 ● 우회 방법 ○ cut vertex에 dependency가 없는 leaf에 대한 sensor 노드를 추가 (최종 노드가 완료될 때까지 스케줄 종료를 막음) Appendix. Airflow Issues
  • 34. EXTENDED SEOUL Leaf-less backfill not working ● 발생 원인 : ○ 스케줄러가 runnable 한 leaf 노드가 없는 스케줄을 종료시킴 ● 1.8 버그로 확인됨 ● 1.10에서 해소됨 ● 우회 방법 ○ 재처리 하고자 하는 중간 노드에 leaf 인 child 노드를 추가한 후 clear Appendix. Airflow Issues
  • 35. EXTENDED SEOUL Stuck in queued state issue ● 발생 원인 : ○ 스케줄러가 dag import 과정에서 timeout 으로 실패한 경우 이를 해소하지 않고 방치함 ● 1.8 버그로 확인됨 ● 1.9 이후로 해소됨 ● 우회 방법 ○ 설정 중 dagbag_import_timeout 값을 충분히 큰 값으로 지정해 줌 Appendix. Airflow Issues
  • 36. EXTENDED SEOUL Appendix. Airflow Sequence Diagram (Scheduler)
  • 37. EXTENDED SEOUL Appendix. Airflow Sequence Diagram (Worker)
  • 40. EXTENDED SEOUL Appendix. Airflow Cut Vertex 제거 시 그래프가 복수의 컴포넌트로 분리되는 지점의 노드 ● 아래 예시의 L2_CUT_VERTEX, L4_CUT_VERTEX ● Cut Vertex 는 해당 지점의 upstream 과 downstream을 잇는 유일한 지점 1.8 버전 버그 발생 조건 ● L2_CUT_VERTEX 에서 failed ● L3_A, L3_B, L3_C 모두 all_success 트리거 룰로 세팅 되어 있음 ● 스케줄러는 L2_CUT_VERTEX 실패 시 이하 노드를 수행할 필요가 없다고 판단하여 스케줄을 종료시킴 (만약 L4_CUT_VERTEX 가 all_done 룰이라면 의도하지 않은 동작임)