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 : 워크플로우 (일의 진행 과정/흐름) 관리 플랫폼
간단한 파이썬 프로그래밍을 통해 데이터 파이프라인을 구성 / 스케줄링 / 모니터링
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 스케줄을 자동 생성
25. EXTENDED SEOUL
여러가지 이슈들, 오픈소스 참여
버그
● Airflow 내부적인 버그들은 소스 분석 후 수정
**Appendix. Airflow Issues
성능 이슈
● Airflow 스케줄링 또는 웹 뷰 출력 단계에서의 지연 이슈 해소
특정 조건의 task instance 를 쿼리할 때 slow query 발생하는 부분 개선
사용성 이슈
● Airflow 에서 다소 직관적이지 않거나 운영 상 비효율적인 부분들도 수정
clear -f 실행 시 upstream_failed 는 처리되지 않는 이슈 해소
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
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 룰이라면 의도하지 않은 동작임)