airflow를 이용한 배치 데이터 처리-(1)

업데이트:

워크플로우 관리 도구 중 하나인 airflow를 이용하여 배치 데이터를 처리해봅니다.

이번 포스팅에서는 워크플로우 관리에 대한 개념과 배치 데이터 처리의 개념을 정리합니다.

2번째 포스팅에서는 airflow의 개념과 제공하는 기능에 대해 정리합니다.

소개

데이터를 수집 -> 가공 -> 적재 처리를 자동화하는 것을 보통 데이터 파이프라인 자동화라고 한다. 리눅스의 cron과 같은 명령어로 특정 스크립트를 주기적으로 실행할 수 있으나, 모니터링과 데이터 실패 시 재실행하는 과정은 워크플로우가 커지게 되면 점차 어려워진다.

이를 돕기 위해 나온 도구가 워크플로우 관리 도구이다. 주로 다음과 같은 기능을 제공한다.

  • 태스크를 정기적인 스케줄로 실행하고, 결과 통지하기
  • 태스크 간의 의존 관계를 정하고, 정해진 순서대로 빠짐없이 실행하기
  • 태스크의 실행 결과를 보관하고, 오류 발생 시에는 재실행하기.

오픈소스 워크플로 관리 도구는 다음과 같은 것들이 있다.

이름 종류 개발사
Airflow 스크립트 형 Airbnb
Azkaban 선언형 LinkedIn
Digdag 선언형 treasure data
Luigi 스크립트 형 Spotify
Oozie 선언형, hadoop Apache
  • 선언형 : XML이나 YAML과 같은 서식으로 워크플로를 기술한다.
  • 스크립트형 : 파이썬과 같은 스크립트 언어로 워크플로를 기술한다.

에러와 복구 방법

빅데이터를 처리하다 보면 네트워크 장애, 하드웨어 장애, 스토리지 용량 부족, 쿼리 증가에 따른 성능 증가 등 다양한 오류가 발생한다. 워크플로우가 에러 핸들링하는 방법은 다음과 같다.

복구와 플로우 재실행

기본적으로 워크플로우 관리 도구에서 에러를 자동 회복할 수는 없다. 대신 수작업에 의한 복구를 전제한 태스크를 설계한다. 실패한 태스크는 모두 기록해서 나중에 재실행할수 있도록 한다.

airflow에서 에러 태스크 재실행하기

image-20200609095551202

  • failed 표시된 task를 클릭하여 해당 태스크만 재실행할 수 있다.

image-20200609095712028

재시도

단순하게 태스크의 재실행을 통해 수작업을 통하지 않고 에러를 복구하는 방법도 있다.

재시도 횟수와 재시도 간격 설정은 태스크의 성격에 따라 다르다. 이상적으로는 재시도 없이 모든 오류를 통지해서 디버깅하는것이 좋다.

백필

백필이란 파라미터에 포함된 일시를 순서대로 바꿔가면서 일정 기간의 플로우를 연속해서 실행하는 구조다. 다음과 같은 경우 사용한다.

  • 새롭게 만든 워크플로를 과거로 돌아가 실행
  • 태스크 실패가 계속된 후에 이를 모두 모아서 재실행

대규모의 백필을 실행할 떄는 성능상의 주의가 필요하다. 과거 오랜 기간의 데이터를 한순간에 처리하려면 큰 부하가 생긴다.

idempotent 멱등성

복구를 위해 재실행할때는 동일 태스크를 여러 번 실행해도 동일한 결과를 이끌어내야 한다.(idempotent)

이를 위해

  • ‘데이터를 insert하는 태스크는 하나의 태스크’로 이루어게끔 하고, 재실행은 하지 않거나.(atomic operation)

  • ‘테이블을 삭제한 뒤 다시 생성하는’ 것처럼 태스크를 여러번 시도해도 동일한 결과가 되도록 해야 한다.(idempotent operation)

태스크 큐

워크플로 관리 도구에서는 태스크의 크기나 동시 실행 수를 변화시킴으로써 자원의 소비량을 조절하여 모든 태스크가 원활하게 실행되도록 해야 한다.

빠른 실행을 위하여 병렬 처리를 하게 되면, 병렬 처리하는 만큼 태스크 수가 늘어난다. 대량의 태스크를 병렬 실행하면 서버에 부하가 늘어나므로 제한이 필요하다. 이러한 경우 사용하는 것이 task queue다. 모든 태스크는 큐에 저장되고 일정 수의 워커 프로세스가 태스크를 순서대로 꺼내면서 병렬 실행된다.

img

댓글남기기