without haste but without rest

워크플로우 관리와 멱등성 본문

Data Engineering & DataOps

워크플로우 관리와 멱등성

JinungKim 2022. 2. 3. 17:23
빅데이터를 지탱하는 기술, 니시다 케이스케

Workflow Management

데이터 관리를 자동화하고 안정된 배치 처리를 실행하기 위해 워크 플로우 툴을 사용한다. 워크 플로우 툴은 정기적으로 태스크를 실행하고 비정상적인 상태를 감지하여 해결을 돕는 것이 목적이다.

 

워크로드 오류로부터 복구하는 방법 2가지

  1. 재시도 - 단순한 재실행
  2. 백필(backfill) - 일정 기간의 플로우를 연속해서 실행하는 구조

백필은 주어진 날짜 파라미터를 기준으로 일정 기간의 플로우를 다시 실행한다. 오류로 인해 태스크를 재실행 해야하거나 혹은 새롭게 만든 워크플로를 과거로 거슬러 올라가 실행해야할 때 사용한다.

만약 태스크가 업데이트가 되어서 한 달 전 데이터 부터 오늘 만든 새로운 태스크를 적용해야 한다고 가정해보자. 이전의 태스크로 인해 생성된 결과가 새로운 태스크의 결과에 영향을 미칠 수도 있다. 이러한 이유로 백필을 위해서는 멱등성이 보장되어야 한다. 


멱등한 조작(idempotent operation)

멱등성: 동일한 태스크를 여러번 시도해도 같은 결과가 나오는 것

 

  • 각 태스크는 원칙적으로 마지막까지 성공하거나, 혹은 실패하면 아무 것도 남지 않아야 한다.
  • 트랜잭션 대응이 가능한 디비라면 여러번 쓰기를 한 번의 트랜잭션으로 처리 가능 하다. 
  • SQL에서 테이블이 존재하면 삭제 후 다시 만드는 것이 멱등한 조작의 예이다.
  • 원칙적으로 항상 데이터를 덮어써야 한다.(upsert)
  • 일반적으로 워크플로우의 각 태스크는 Append, Replace 중 하나를 실시한다. 이때 Append는 데이터가 중복될 수 있지만, Replace는 반복해도 결과가 변하지 않으므로 멱등하다.
  • 멱등한 파라미터를 만들기 위해서 태스크에 부여된 파라미터를 이용해서 고유의 이름을 생성하고, 여러 번 실행해도 항상 치환이 시행되도록 설계한다. 
  • 현실에서는 항상 멱등한 태스크를 구현할 수 없으므로 시계열 테이블을 시간 단위로 파티셔닝 한다. 테이블을 파티션 단위로 Replace 하면 멱등을 보장할 수 있다.

데이터 플로우와 워크플로우

워크 플로우 툴 예시 - Airflow

데이터 플로우 툴 예시 - Spark

 

데이터 플로우는 분산 스토리지에서 데이터를 읽고 가공한다. 이때 목적지 DB에 직접 쓰지 않고, 간단한 파일 포맷으로 파일을 생성하기만 한다. 가공한 파일 삽입은 워크 플로우에서 진행한다. 데이터 플로우에서 대량의 데이터를 삽입하는 경우 계속해서 리소스를 점유하거나 혹은 타임 아웃에 걸리는 경우 처음부터 다시 실행해야하는 문제가 발생할 수 있다.


데이터 플로우와 SQL을 나누어 사용하기

위에서 설명한, 워크 플로우에서 데이터 삽입은 쿼리 엔진을 통해 수행한다. 

두 가지 케이스가 존재한다.

 

- SQL을 MPP DW에서 사용하는 경우 -> 전통적인 데이터웨어하우스 파이프라인

- SQL을 분산 시스템 상의 쿼리 엔진에서 실행하는 경우 -> 데이터마트 파이프라인


람다 아키텍처와 카파 아키텍처

람다 아키텍처 - 스피드, 배치, 서빙  3 레이어를 사용해서 실시간 뷰는 스트림에서, 정확한 데이터는 배치 뷰에서 확인한다.

카파 아키텍처 - 스피드 레이어만 사용한다. 대신 메시지 브로커의 보존 기간을 늘려서 백필이 가능하게 한다. 다만 장기간의 데이터를 데이터 플로우에 흘려보내면 평상시와 비교해서 많은 리소스를 일시적으로 소비하게 되는 단점이 존재


Out Of Order 데이터 처리

스트림 처리에서 늦게 도달하는 메시지, 즉 프로세스 시간과 이벤트 시간의 차이로 인한 문제로 Out of order의 데이터 문제라고 불린다.

이벤트 타임 윈도윙

순서가 뒤바뀐 데이터의 원래 모습은 이벤트 시간으로 얻을 수 있다. 스트림 처리에서 시간을 일정 간격으로 나누어 윈도우를 만들고 그 안에서 데이터를 집계한다. 이벤트 시간에 의해 윈도우를 나누는 것을 이벤트 타임 윈도윙이라고 한다. 예를 들어 과거 1시간의 이벤트 수 추이를 그래프로 만든다면 데이터를 1분 간격인 60개의 윈도우로 나누고 이벤트 시간으로 바꾸어 나열한다.

 

+

웨비나를 보니까 각 컴포너트를 거칠 때마다의 타임스탬프를 메시지에 기록하는 방법을 사용하고 있는 회사도 존재한다. 

 

텀블링 윈도우: 고정적인 윈도우 사이즈를 사용하며 겹치는 부분이 없다.

호핑 윈도우: 고정적인 윈도우 사이즈를 사용하는데 켭치는 부분이 존재한다.

슬라이딩 윈도우: 고정적인 윈도우를 사용하는데, 각 데이터의 타임스탬프 기준으로 윈도윙하므로 겹칠 수도 안 겹칠 수도 있다. 


 

Comments