[빅데이터를 지탱하는 기술] 5장_빅데이터 파이프라인
1. 워크 플로우 관리
기초 지식
워크 플로우 관리 도구
워크 플로우 관리 도구의 주요 역할은, 정기적으로 태스크를 실행하고 비정상적인 상태를 감지하여 해결을 돕는 것이다.
ex) Airflow, Azkaban, Digdag, Luigi, Oozie
태스크
데이터 파이프라인의 실행 과정에서 데이터를 잇달아 이동하면서 정해진 처리를 반복하는데, 이때 실행되는 개별 처리이다.
기본 기능
테스크를 정기적인 스케쥴로 실행하고 결과 통지
테스크 간의 의존 관계를 정하고 순서대로 빠지없이 실행
테스크의 실행 결과를 보관하고, 오류 발생하면 재실행 할 수 있도록 하기
선언 형과 스크립트 형
- 선언형 : XML 이나 YAML 등의 서식으로 워크플로우 기술
- 스크립트형 : 스크립트 언어로 워크플로우 정의
오류로부터 복구 방법
모든 오류를 사전에 예상하는 것은 불가능하기 때문에, 오류 발생 가능성을 고려하여 대처 방법을 결정해야한다.
Retry
재시도를 반복해도 문제가 없는 태스크라면, 1회나 2회의 재시도를 실행해도 좋다.
그러나, 그 이상은 재시도가 아니라 올바른 문제 해결 방법을 찾아야한다.
Backfill
플로우 전체를 처음부터 다시 실행한다. 다음 상황에 사용한다.
- 태스크의 실패가 며칠 동안이나 계속된 후에 이를 모아서 재시도 하고 싶을 때
- 새롭게 만든 워크 플로우를 과거로 거슬라 올라가 실행하고 싶을 때
재실행의 안정성을 위한 두가지 방법
원자성 조작 (Atomic Operation)
예를 들어, INSERT 문 2회를 호출하는 태스크가 있다고 하자.
첫 번째의 INSERT 가 종료되고 오류가 발생하면 태스크를 재실행하면 동일한 데이터가 다시 쓰이게 될 수 있다.
이 문제를 회피하기 위해, 각 태스크가
시스템에 변경을 가하는 것을 한 번만 할 수 있도록
하는 것이다.쓰기가 필요한 수 만큼 테스크를 나누는 것이다.
하지만, 태스크 구현상의 버그 등으로 원자성 조작 직후에 문제가 발생하면 원자성 조작 자체는 성공했어도 워크 플로우 관리 도구에서는 오류로 여길 수 있다.
멱등한 조작
더 확실한 방법은,
동일한 태스크를 여러 번 실행해도 동일한 결과
가 되도록 하는 것이다.예를 들어 분산 스토리지에 파일을 업로드할 때,
- 매번 새로운 파일명을 만들 경우 데이터를 추가 (append) 하는 것이고,
- 동일 파일명으로 덮어쓰면 치환 (replace)하는 것이다. 치환은 반복해도 결과가 변하지 않으므로 멱등하다.
데이터 추가
멱등한 추가
과거의 모든 데이터를 치환하면 멱등하지만 부하가 커진다. 그래서, Table Partitioning 이 필요하다.
예를 들면 테이블을 1일마다 또는 1시간 마다 파티션으로 분할하고 파티션 단위로 치환하는 것이다.
파티션의 모든 데이터를 삭제할 때, TRUNCATE 문이나 INSESRT OVERWRITER 문 등을 사용할 수 있다.
ex) Hive 는 파티셔닝 지원, Amazon Redshift 는 파티셔닝을 지원하지 않아 UNION ALL 사용
원자성을 지닌 추가
하나의 테이블에 여러번 데이터를 써넣는 경우, 중간 테이블을 이용해 마지막에 목적 테이블에 한 번 추가한다.
즉, 전반 부분에서는 중간 테이블을 만들기 위해 테이블을 치환하므로 멱등하다.
그러나 마지막에 INSESRT 는 단순히 추가이므로 전체로서는 멱등하지 않다.
단, 마지막에 쓰기를 1회만 실시하므로 이것은 원자성을 지닌 조작이다.
그래서 플로우가 실패해도 아무것도 쓰이지 않아 실패한 태스크를 재실행해도 복구가 완료된다.