아래 대부분의 내용은 도서 빅데이터를 지탱하는 기술에서 발췌했습니다.

워크플로 관리

  • 기업 내의 정형적인 업무 프로세스를 진행하기 위한 구조
  • 자동화된 워크플로
    • 태스크는 정해진 스케줄에 따라 자동으로 실행되고, 무언가 비정상적 일이 발생한 경우에는 사람이 개입하여 문제를 해결


워크플로 관리 도구

  • 정기적으로 태스크를 실행하고 비정상적인 상태를 감지하여 그것에 대한 해결을 돕는 역할
    • 태스크를 정기적인 스케줄로 실행하고 그 결과 통지
    • 태스크 간의 의존 관계를 정하고, 정해진 순서대로 빠짐없이 실행하기
    • 태스크의 실행 결과를 보관하고, 오류 발생 시엔 재실행할 수 있도록 함
  • 데이터 파이프라인의 실행에 특화한 오픈 소스의 워크플로 관리 도구가 여럿 개발되었음
  • 태스크: 데이터 파이프라인의 실행 과정에서 반복되는 개별 처리


워크플로 관리 도구의 종류
  • 선언형(declarative) 도구
    • XML, YAML 등의 서식으로 워크플로를 기술
    • 미리 제공된 기능만 이용할 수 있고, 유지 보수성 높음
    • 동일 쿼리를 파라미터만 바꿔 여러 번 실행하거나 워크플로를 단순 반복으로 자동 생성하는 경우에 유용
  • 스크립트형(scripting) 도구
    • 스크립트 언어로 워크플로를 정의하는 유형
    • 유연성 높음


발생 가능한 오류의 복구 방법

  • 기본적으로 워크플로 관리에서는 오류에 대해 수작업에 의한 복구(recovery) 를 전제한 태스크를 설계
  • 실패한 태스크는 모두 기록하여 그것을 나중에 재실행할 수 있도록 함
  • flow: 워크플로 관리 도구에 의해 실행되는 일련의 태스크
    • 각 플로우에는 실행 시 고정 파라미터가 부여되어 있음
      • e.g.) 일별 배칠 처리라면 특정 날짜가 파라미터가 -
  • 복구의 기초
    • 동일 플로우에 동일 파라미터를 건네면 완전히 동일한 태스크가 실행되도록 한다.
    • 플로우가 도중에 실패해도 나중에 동일 파라미터로 재실행이 가능하기 때문
    • 대부분의 워크플로 관리 도구는 과거에 실행한 플로우와 그 파라미터를 자동으로 데이터베이스에 기록하게 되어 있음
    • 실패한 플로우를 선택, 재실행하면 복구가 완료됨
  • 태스크를 되도록 작게 유지해야 오류로 인한 스케줄 지연을 최소한으로 억제할 수 있음
  • 재시도
    • 여러 번 발생하는 오류에 대해 자동화해 수작업 없이 복구
    • 재시도 간격은 5분, 10분 정도로 둔다.
    • 재시도 횟수에는 주의가 필요
      • 재시도가 적으면 복구되기 전에 재시도가 종료되어 태스크 실행에 실패
      • 재시도가 너무 많으면 태스크가 실패하지 않은 것처럼 되기 때문에 중대한 문제가 발생해도 눈치채지 못함
    • 이상적으로는 전혀 재시도 없이 모든 오류를 통지하는 것이 좋음
    • 재시도를 반복해도 문제가 없는 태스크라면, 1회나 2회의 재시도를 실행해도 좋지만, 오류의 원인을 그때마다 조사하여 오류가 일어나지 않도록 대책을 마련하는 것이 가장 좋음


원자성 조작과 멱등한 조작
  • 실패 또는 성공만 있어야 한다. 도중까지 성공은 허가하지 않음.
  • 데이터의 중복 등을 막기 위해 각 태스크가 시스템에 변경을 가하는 것을 한 번만 할 수 있도록 한다.
  • 원자성 조작
    • 쓰기가 필요한 수만큼 태스크를 나누도록 함
    • 하지만 여전히 재시도의 중복 가능성이 있음
      • 네트워크 경유로 로드 명령을 발행, 그 후에 통신이 끊어져 오류가 발생했다면 로드 명령이 취소될지 아니면 실행이 계속될지는 데이터베이스를 조작해봐야 안다.
    • 재시도는 무효로 하고, 오류 발생 시에는 수작업으로 복구하는 편이 좋음
  • 멱등한 조작
    • 동일한 태스크를 여러 번 실행해도 동일한 결과가 되도록 하는 것
    • SQL의 경우, 테이블을 삭제한 후 다시 만들기
    • 추가: 파일 업로드할 때마다 새로운 파일명을 만드는 경우 (데이터가 중복됨)
    • 치환: 동일 파일명으로 덮어쓰기 (반복해도 결과가 변하지 않음, 멱등함)
      • 멱등한 태스크를 만들기 위해서는 태스크에 부여된 파라미터를 이용해 고유의 이름을 생성하고, 여러 번 실행해도 항상 치환이 시행되도록 설계
      • e.g.) 날짜와 시간을 파라미터로 전달함으로써 치환 형의 태스크를 구현
  • 테이블 파티셔닝
    • 테이블을 1일 또는 1시간마다 파티션으로 분할하고, 파티션 단위로 치환하게 함
  • 지수 백오프
    • 대다수의 데이터 전송 도구와 클라이언트 라이브러리는 재시도 횟수를 세세하게 제어하기 위한 옵션이 있음
    • 여러 시간 동안의 재시도가 예상되는 경우, 그 오류만을 대상으로 재시도 제어를 한다.
    • 재시도 횟수를 늘림과 동시에 조금씩 재시도 간격을 넓혀감


처리 효율을 최대화하기

  • 워크플로 관리 도구는 외부 시스템에 영향을 미치는 부하를 조정하는 역할도 담당
  • 태스크의 크기나 동시 실행수를 잘 제어해 안정적인 태스크 실행, 자원의 유효한 활용 을 양립하게 한다.
  • 워크플로 관리 도구에 등록된 태스크는 모두 너무 크지도 않고, 너무 작지도 않은 적당한 크기로 분할된 다수의 태스크가 여러 워커로부터 호출되고 있는 상태가 된다.


태스크 큐
  • job queue, task queue
  • 너무 대량의 태스크를 동시 실행하면 서버에 과부하가 걸리므로, 제한을 두는 것
  • 모든 태스크를 일단 큐에 저장하고 일정 수의 워커 프로세스가 순서대로 꺼내면서 병렬화를 실현