일괄 처리 시스템
1. 개요
1. 개요
일괄 처리 시스템은 대량의 데이터를 수집하여 한 번에 처리하는 컴퓨팅 방식을 가리킨다. 사용자나 외부 시스템의 실시간 상호작용 없이, 미리 정의된 작업을 순차적 또는 병렬적으로 실행하는 것이 핵심 특징이다. 이 방식은 처리 효율성이 높고, 자원 활용을 최적화할 수 있으며, 특히 대규모 데이터 분석, ETL 프로세스, 정기적인 보고서 생성과 같은 반복적이고 계산 집약적인 작업에 적합하다.
초기 메인프레임 컴퓨터 시절부터 발전해 온 이 개념은, 오늘날 Hadoop MapReduce, Apache Spark, Apache Flink (배치 모드)와 같은 현대적 분산 컴퓨팅 프레임워크의 기반이 되었다. 이러한 시스템은 작업을 여러 노드에 분산시켜 병렬 처리함으로써, 단일 컴퓨터로는 처리하기 어려운 페타바이트 규모의 데이터도 다룰 수 있다.
일괄 처리의 일반적인 흐름은 작업 정의와 제출, 작업 스케줄링, 자원 할당, 실제 실행, 그리고 결과 수집 및 저장의 단계를 거친다. 이 과정은 전체 작업이 완료될 때까지 실행되며, 실시간으로 데이터를 처리하는 스트림 처리 시스템과는 대조를 이룬다.
2. 역사적 배경
2. 역사적 배경
일괄 처리 시스템의 기원은 컴퓨팅 역사의 초기 단계로 거슬러 올라간다. 1950년대부터 1960년대까지 주류 컴퓨터 시스템은 메인프레임이었으며, 사용자는 천공 카드나 종이 테이프에 프로그램과 데이터를 입력하여 시스템 운영자에게 제출했다. 운영자는 이러한 작업들을 모아 순차적으로 실행했는데, 이는 컴퓨터 시간이 귀했고, 작업 간의 전환에 상당한 준비 시간이 필요했기 때문이다. 이러한 수동적인 작업 모음과 순차적 실행 방식이 현대 일괄 처리의 개념적 시초가 되었다.
1960년대에 등장한 IBM OS/360과 같은 초기 운영 체제는 작업 제어 언어를 도입하여 일괄 처리를 자동화하는 데 기여했다. 사용자는 JCL 카드 덱을 통해 작업 순서와 필요한 자원을 정의할 수 있게 되었다. 이 시기의 시스템은 주로 카드 리더에서 입력을 받고 라인 프린터로 결과를 출력하는 방식으로 운영되었다. 컴퓨터의 중앙 처리 장치 활용률을 극대화하기 위해 작업들을 미리 정렬하여 실행하는 일괄 스트림 방식이 표준이었다.
1970년대와 1980년대에 유닉스 운영 체제가 발전하면서 명령줄에서 batch 명령어나 cron 같은 도구를 이용한 보다 유연한 일괄 작업 스케줄링이 가능해졌다. 그러나 근본적인 모델은 변하지 않았으며, 대화형 시분할 시스템과는 구분되는 영역으로 자리 잡았다. 1990년대 후반부터 2000년대에 이르러 인터넷의 폭발적 성장과 데이터 센터의 확산으로 생성되는 데이터의 규모가 기하급수적으로 증가하면서, 구글의 MapReduce 논문(2004년) 발표는 새로운 전환점을 마련했다.
이 논문은 상용 컴퓨터로 구성된 대규모 클러스터에서 방대한 데이터 세트를 병렬로 처리하는 프로그래밍 모델과 시스템 구현을 제시했다. 이는 아파치 하둡의 기반이 되었으며, 2000년대 중반 이후 빅데이터 시대를 열어젖힌 핵심 기술로 자리매김했다. 하둡의 등장은 일괄 처리 시스템을 단일 머신의 개념에서 수천 대의 컴퓨터로 구성된 분산 컴퓨팅 환경으로 진화시켰다. 이후 아파치 스파크와 같은 메모리 기반 처리 엔진이 등장하며 성능을 획기적으로 개선했지만, 기본적인 "모아서 처리한다"는 일괄 처리의 철학은 그 역사적 맥락을 이어가고 있다.
3. 핵심 개념
3. 핵심 개념
일괄 처리 시스템의 핵심 개념은 사용자가 정의한 작업을 수집하여 한꺼번에 처리하는 방식에 기반한다. 이는 대규모 데이터를 효율적으로 처리하기 위한 기본 원리를 제공한다.
핵심 개념의 첫 번째 요소는 작업 정의와 제출이다. 사용자는 처리할 데이터와 실행할 프로그램 또는 명령을 포함하는 작업을 정의한다. 이 작업은 일반적으로 작업 제출 스크립트나 작업 제어 언어를 통해 시스템에 제출된다. 시스템은 제출된 작업을 작업 큐에 넣고, 순차적 또는 우선순위에 따라 실행할 준비를 한다. 작업 정의에는 필요한 컴퓨팅 자원과 예상 실행 시간, 의존성 등이 명시될 수 있다.
두 번째 핵심은 작업 스케줄링이다. 스케줄러는 대기 중인 작업들을 어떤 순서로 실행할지 결정한다. 일반적인 정책으로는 선입선출, 최단 작업 우선, 또는 자원 기반 스케줄링이 사용된다. 스케줄러는 시스템의 전체 처리량을 최대화하거나, 개별 작업의 완료 시간을 최소화하는 것을 목표로 한다. 복잡한 시스템에서는 작업 간의 의존성을 고려한 DAG 스케줄링도 수행된다.
마지막 핵심 개념은 자원 관리이다. 시스템은 한정된 CPU, 메모리, 저장장치, 네트워크 대역폭을 여러 작업에 효율적으로 할당해야 한다. 자원 관리자는 작업 실행 전에 필요한 자원을 예약하고, 실행 중에는 자원 사용을 모니터링한다. 이를 통해 시스템의 자원 활용도를 극대화하고, 개별 작업이 과도한 자원을 점유하지 못하도록 제한한다. 이러한 관리 하에서 각 작업은 할당받은 자원 내에서 격리되어 실행된다.
3.1. 작업 정의와 제출
3.1. 작업 정의와 제출
작업은 일반적으로 작업 제어 언어나 시스템이 제공하는 특정 스크립트를 통해 정의된다. 이 정의에는 실행할 프로그램의 경로, 필요한 입력 데이터의 위치, 출력을 저장할 경로, 그리고 작업 실행에 필요한 컴퓨팅 자원의 양(예: CPU 시간, 메모리)에 대한 명세가 포함된다. 일부 시스템에서는 작업 간의 의존성을 정의하여 특정 작업이 완료된 후에만 다음 작업이 실행되도록 설정할 수 있다.
작업 제출은 사용자가 정의한 작업을 시스템의 대기열에 넣는 과정이다. 사용자는 명령줄 인터페이스나 웹 인터페이스, API를 통해 작업을 제출한다. 제출된 작업은 즉시 실행되지 않고, 작업 스케줄러가 자원 상황과 우선순위에 따라 실행 시점을 결정할 때까지 대기 상태로 남아 있다. 제출 시 작업에 고유한 ID가 부여되어 상태 추적과 관리가 가능해진다.
작업 정의 파일의 형식은 시스템마다 차이가 있다. 예를 들어, Hadoop의 경우 MapReduce 프로그램을 패키징한 JAR 파일과 설정을 명시하는 것이 일반적이다. 전통적인 메인프레임 시스템에서는 JCL과 같은 전용 언어를 사용했다.
구성 요소 | 설명 | 예시 |
|---|---|---|
실행 파일/스크립트 | 수행할 실제 프로그램 또는 명령어 |
|
입력 데이터 경로 | 작업이 읽을 데이터가 저장된 위치 |
|
출력 데이터 경로 | 작업 결과를 쓸 위치 |
|
자원 요구사항 | 필요한 CPU 코어, 메모리, 예상 실행 시간 |
|
작업 의존성 | 선행되어야 하는 다른 작업 ID |
|
3.2. 작업 스케줄링
3.2. 작업 스케줄링
작업 스케줄링은 일괄 처리 시스템에서 대기열에 쌓인 작업들을 효율적으로 순서화하고, 가용한 컴퓨팅 자원에 할당하는 핵심 과정이다. 이 과정의 주요 목표는 전체 시스템의 처리량을 최대화하거나, 작업들의 평균 완료 시간을 최소화하는 것이다. 스케줄러는 작업의 우선순위, 예상 소요 시간, 필요한 자원 양, 그리고 작업 간의 의존성 등의 정보를 고려하여 결정을 내린다.
일반적인 스케줄링 정책은 다음과 같이 분류된다.
정책 유형 | 설명 | 주요 목표 |
|---|---|---|
선입선출(FIFO) | 작업이 도착한 순서대로 처리한다. | 구현의 단순성 |
최단 작업 우선(SJF) | 예상 실행 시간이 가장 짧은 작업을 먼저 처리한다. | 평균 대기 시간 최소화 |
우선순위 기반 | 사전에 정의된 우선순위(예: 긴급도, 비즈니스 중요도)에 따라 처리한다. | 중요한 작업의 신속한 완료 |
현대의 분산 일괄 처리 시스템에서는 클러스터 환경에서 동작하는 고급 스케줄러가 사용된다. 이러한 스케줄러는 다수의 작업 관리자로부터 작업을 수집하고, 클러스터 내의 여러 노드에 분산하여 할당한다. 자원 할당 시에는 CPU 코어 수, 메모리 용량, 디스크 공간, 네트워크 대역폭 등을 고려하여 자원 관리를 수행한다. 또한, 특정 작업이 실패했을 때를 대비한 재시도 정책이나, 더 높은 우선순위의 작업이 도착했을 때 선점을 허용할지 여부도 중요한 스케줄링 결정 요소이다.
효율적인 스케줄링은 시스템 자원의 유휴 상태를 줄이고, 작업 처리의 전체적인 지연을 방지한다. 특히 데이터 지역성을 고려하여, 작업을 해당 데이터가 저장된 물리적 노드에 가깝게 배치하면 데이터 전송 오버헤드를 크게 줄일 수 있다[1]. 따라서 스케줄러는 자원 가용성과 데이터의 물리적 위치 정보를 종합적으로 판단하여 최적의 실행 계획을 수립한다.
3.3. 자원 관리
3.3. 자원 관리
자원 관리는 일괄 처리 시스템이 제한된 컴퓨팅 자원(예: CPU, 메모리, 디스크 I/O, 네트워크 대역폭)을 여러 작업 사이에 효율적으로 할당하고 모니터링하는 과정을 말한다. 이는 시스템의 전체 처리량을 극대화하고 개별 작업의 성능 요구 사항을 충족시키는 데 핵심적인 역할을 한다. 자원 관리자는 작업의 실행을 위해 필요한 자원을 예약하고, 실제 사용량을 추적하며, 작업 완료 후 자원을 시스템에 반환하는 책임을 진다.
자원 할당은 일반적으로 작업이 제출될 때 명시된 자원 요구 사항(예: 필요한 코어 수, 메모리 양)을 기반으로 이루어진다. 시스템은 이러한 요청을 받아들여 사용 가능한 자원 풀에서 적절한 양을 할당한다. 대규모 클러스터 환경에서는 자원 관리자가 중앙에서 클러스터 전체의 자원을 통합 관리하는 아키텍처를 사용한다. 대표적인 예로 Apache Hadoop YARN이나 Apache Mesos가 있으며, 이들은 클러스터의 자원을 가상화하여 다양한 일괄 처리 프레임워크(예: MapReduce, Apache Spark)에 동적으로 할당할 수 있게 한다.
효율적인 자원 관리를 위한 주요 기법은 다음과 같다.
기법 | 설명 |
|---|---|
자원 격리 | 각 작업이 할당받은 자원(특히 CPU와 메모리)을 다른 작업의 간섭 없이 독립적으로 사용할 수 있도록 보장한다. 컨테이너 기술(예: Docker)이나 운영체제 수준의 격리 메커니즘이 활용된다. |
자원 스케줄링 정책 | 작업 큐에 대기 중인 작업들에 자원을 할당하는 순서와 방식을 결정한다. 선입선출(FIFO), 용량 스케줄링(Capacity Scheduler), 공정 스케줄링(Fair Scheduler) 등 다양한 정책이 존재한다[2]. |
동적 자원 조정 | 작업 실행 중에 실제 자원 사용량을 모니터링하여 초기 요청보다 부족하거나 과다한 경우 자원을 재할당할 수 있다. 이를 통해 자원 활용률을 개선하고 작업 실패를 방지할 수 있다. |
자원 관리의 궁극적 목표는 주어진 하드웨어 인프라 내에서 가능한 한 많은 작업을 성공적으로 완료하는 것이다. 따라서 자원 할당의 공정성과 효율성 사이의 균형, 그리고 작업의 우선순위와 서비스 수준 계약(SLA)을 고려한 정책 수립이 중요하다.
4. 주요 구성 요소
4. 주요 구성 요소
일괄 처리 시스템은 일반적으로 작업 관리자, 스케줄러, 실행 엔진이라는 세 가지 핵심 구성 요소로 이루어진다. 각 구성 요소는 명확한 책임을 가지며, 협력하여 작업의 효율적인 실행을 보장한다.
작업 관리자는 사용자 인터페이스를 제공하고 작업을 정의 및 제출하는 역할을 담당한다. 사용자는 작업 관리자를 통해 실행할 프로그램, 필요한 입력 데이터, 출력 위치 등을 지정한 작업 정의를 생성한다. 제출된 작업은 일반적으로 작업 큐에 들어가며, 작업 관리자는 작업의 상태(대기, 실행 중, 완료, 실패)를 추적하고 사용자에게 피드백을 제공한다.
스케줄러는 대기 중인 작업을 순서대로 실행할 시점과 자원을 결정하는 두뇌 역할을 한다. 스케줄러는 시스템의 가용 자원(예: CPU 코어, 메모리, 디스크 공간)을 모니터링하고, 작업 스케줄링 정책에 따라 큐에서 작업을 선택하여 실행 엔진에 할당한다. 일반적인 스케줄링 정책에는 FIFO, 공정 스케줄링, 우선순위 기반 스케줄링 등이 있다.
실행 엔진은 스케줄러로부터 할당받은 작업을 실제 물리적 또는 가상의 자원 위에서 실행하는 구성 요소이다. 실행 엔진은 작업을 구성하는 개별 태스크를 클러스터의 여러 노드에 분배하고, 실행을 감시하며, 실패 시 재시도하는 책임을 진다. 또한, 작업 실행 중에 생성된 중간 데이터와 최종 결과를 지정된 저장소에 기록한다. 이 세 구성 요소의 상호작용은 아래 표와 같다.
구성 요소 | 주요 책임 | 상호작용 대상 |
|---|---|---|
작업 관리자 | 작업 정의, 제출, 상태 관리 | 사용자, 스케줄러 |
스케줄러 | 자원 모니터링, 작업 할당 결정 | 작업 관리자, 실행 엔진 |
실행 엔진 | 태스크 실행, 자원 관리, 오류 처리 | 스케줄러, 클러스터 자원 |
4.1. 작업 관리자
4.1. 작업 관리자
작업 관리자는 일괄 처리 시스템에서 사용자가 정의한 작업을 시스템에 제출하고, 그 생명주기를 관리하는 핵심 구성 요소이다. 이 컴포넌트는 작업의 제출, 큐잉, 상태 추적, 완료 또는 실패 처리의 전 과정을 담당한다. 사용자는 작업 관리자에게 작업 제출을 통해 처리할 데이터와 실행할 프로그램 또는 스크립트를 정의한 작업 명세를 전달한다. 작업 관리자는 이를 받아 시스템이 처리할 수 있는 내부 형식으로 변환하고, 대기 큐에 넣어 스케줄러가 선택할 수 있도록 준비한다.
작업 관리자의 주요 기능은 작업의 상태를 지속적으로 모니터링하고 사용자에게 피드백을 제공하는 것이다. 작업이 실행되는 동안 작업 관리자는 실행 엔진이나 클러스터 리소스 매니저로부터 상태 업데이트를 받아 작업이 '대기 중', '실행 중', '완료', '실패' 중 어느 단계에 있는지 추적한다. 사용자는 일반적으로 작업 관리자가 제공하는 명령줄 인터페이스(CLI)나 웹 기반 대시보드를 통해 제출한 작업의 진행 상황을 확인할 수 있다.
또한, 작업 관리자는 오류 처리와 재시도 정책을 관리하는 역할도 수행한다. 작업 실행 중 하드웨어 장애나 소프트웨어 예외 등으로 인해 실패하면, 작업 관리자는 미리 정의된 정책에 따라 작업을 자동으로 재시도할 수 있다. 재시도 횟수를 초과하거나 복구 불가능한 오류가 발생하면, 작업 관리자는 작업을 최종적으로 실패 상태로 표시하고 관련 로그와 진단 정보를 사용자에게 보고한다.
주요 책임 | 설명 |
|---|---|
작업 제출 인터페이스 제공 | CLI, API, GUI 등을 통해 작업을 수신한다. |
작업 명세 관리 | 사용자 제출 내용을 시스템 내부 형식으로 변환하고 의존성[3]을 확인한다. |
상태 관리 및 모니터링 | 작업의 전 생명주기 상태를 추적하고 사용자에게 가시성을 제공한다. |
오류 처리 및 재시도 | 실패한 작업에 대한 재시도 정책을 적용하고 최종 실패를 관리한다. |
4.2. 스케줄러
4.2. 스케줄러
스케줄러는 일괄 처리 시스템의 핵심 구성 요소로, 대기열에 제출된 작업들을 실행할 순서와 시점을 결정하는 역할을 담당한다. 시스템의 전체 처리량을 최대화하고, 자원을 효율적으로 활용하며, 사용자가 정의한 우선순위나 제출 시간 같은 제약 조건을 만족시키는 것이 주요 목표이다.
스케줄링 정책은 시스템의 목표에 따라 다양하게 설계된다. 일반적인 정책으로는 선입선출, 최단 작업 우선, 우선순위 기반 스케줄링 등이 있다. 선입선출은 단순하지만 자원 활용도가 낮을 수 있으며, 최단 작업 우선은 평균 대기 시간을 줄이는 데 유리하다. 현대의 분산 일괄 처리 시스템에서는 데이터 지역성을 고려하여 작업을 데이터가 저장된 노드에 할당하거나, 작업 병렬화를 위해 여러 작업을 동시에 실행시키는 정책을 채택하기도 한다[4].
스케줄링 정책 | 주요 목표 | 특징 |
|---|---|---|
선입선출 | 단순성과 공정성 | 구현이 쉽지만, 자원 유휴 상태가 발생할 수 있음 |
최단 작업 우선 | 평균 대기 시간 최소화 | 실행 시간을 예측해야 하며, 긴 작업이 기아 상태에 빠질 수 있음 |
우선순위 기반 | 비즈니스 중요도 반영 | 높은 우선순위 작업을 먼저 처리하지만, 낮은 우선순위 작업이 지연될 수 있음 |
데이터 지역성 최적화 | 네트워크 대역폭 절감 | 작업을 데이터 블록과 가까운 노드에 할당하여 처리 속도를 향상시킴 |
스케줄러는 작업 관리자로부터 작업 목록을 받아들이고, 실행 엔진이나 클러스터 자원 관리자와 통신하여 실제 컴퓨팅 자원(CPU, 메모리, 디스크)을 할당한다. 이 과정에서 작업 간의 의존성, 자원 가용성, 시스템 부하 등을 지속적으로 모니터링하며 동적인 스케줄링 결정을 내린다.
4.3. 실행 엔진
4.3. 실행 엔진
실행 엔진은 일괄 처리 시스템에서 작업 스케줄러에 의해 할당된 실제 컴퓨팅 작업을 수행하는 핵심 구성 요소이다. 이 엔진은 작업 정의에 명시된 프로그램 코드나 명령어를 물리적 또는 가상의 컴퓨팅 자원 위에서 실행하고, 작업의 완료 상태를 관리자에게 보고하는 역할을 담당한다. 실행 엔진의 설계는 처리할 데이터의 규모, 시스템의 내고장성, 그리고 자원 관리 방식에 따라 크게 달라진다.
일반적인 실행 엔진은 작업 관리자로부터 받은 작업 단위(예: 맵 태스크, 리듀스 태스크)를 특정 노드의 컨테이너나 프로세스에서 구동한다. 주요 책임은 다음과 같다.
책임 | 설명 |
|---|---|
작업 실행 | 할당된 코드를 로드하고 필요한 입력 데이터를 읽어 처리 로직을 수행한다. |
자원 모니터링 | 작업 실행 중 CPU, 메모리, 디스크 I/O 사용량을 추적한다. |
상태 관리 | 작업의 시작, 진행 중, 성공, 실패 상태를 유지하고 중앙 관리자에 주기적으로 보고한다. |
오류 처리 | 작업 실행 중 발생하는 예외를 catch하고, 사전 정의된 정책(예: 재시도)에 따라 처리한다. |
출력 처리 |
Hadoop MapReduce의 경우, YARN이 리소스 매니저와 노드 매니저를 통해 실행 엔진의 기능을 제공한다. 각 노드의 노드 매니저는 컨테이너를 생성하고, 그 안에서 사용자의 맵 또는 리듀스 코드가 실행된다. 반면, Apache Spark는 RDD 기반의 DAG 스케줄러와 태스크 스케줄러를 내장한 자체 실행 엔진을 가지며, 인메모리 컴퓨팅을 통해 작업을 효율적으로 처리한다. 실행 엔진의 성능은 데이터 지역성을 얼마나 잘 보장하는지, 작업 병렬화를 어떻게 구현하는지에 크게 의존한다.
5. 대표적인 시스템
5. 대표적인 시스템
Hadoop MapReduce는 구글의 MapReduce 논문에 기반한 오픈 소스 구현체로, 초기 빅데이터 처리를 대중화한 시스템이다. 이 시스템은 작업을 맵 단계와 리듀스 단계로 나누어 처리하며, HDFS에 저장된 데이터를 분산 처리한다. 내결함성을 위해 중간 결과를 디스크에 저장하는 특징이 있어 안정적이지만, 반복적인 작업이나 복잡한 DAG 처리에는 성능 저하가 발생할 수 있다.
Apache Spark는 인메모리 연산을 중심으로 설계되어 Hadoop MapReduce보다 훨씬 빠른 처리 속도를 제공한다. 핵심 데이터 구조인 RDD와 이후의 DataFrame을 통해 맵리듀스 모델을 넘어선 다양한 변환과 액션 연산을 지원한다. Spark는 배치 처리, 스트림 처리, 머신러닝 등을 통합한 통합 스택을 제공하며, 특히 반복적인 알고리즘 실행에 강점을 보인다.
Apache Flink는 본래 스트림 처리를 위한 시스템으로 설계되었지만, 배치 처리를 유한 데이터셋에 대한 특별한 경우의 스트림으로 간주하여 효율적으로 실행한다. Flink의 배치 모드는 메모리 관리와 실행 계획 최적화에 뛰어나며, DAG 기반의 실행 엔진을 통해 낮은 지연 시간과 높은 처리량을 달성한다. 이 시스템은 데이터 흐름 프로그래밍 모델을 채택하여 유연한 배치 애플리케이션 개발을 가능하게 한다.
시스템 | 주요 프로그래밍 모델 | 핵심 특징 | 데이터 저장 계층 |
|---|---|---|---|
Map/Reduce | 디스크 기반 처리, 높은 내결함성 | ||
RDD/DataFrame/Dataset | 인메모리 연산, 통합 스택 | HDFS, S3 등 다수 | |
Apache Flink (배치) | 데이터 흐름 | 유니파이드 배치/스트림, 낮은 지연 | 파일 시스템, 객체 저장소 등 |
5.1. Hadoop MapReduce
5.1. Hadoop MapReduce
Hadoop MapReduce는 아파치 하둡 생태계의 핵심 구성 요소로, 대규모 데이터 세트를 병렬 분산 처리하기 위한 프로그래밍 모델이자 소프트웨어 프레임워크이다. 이 모델은 구글의 MapReduce 논문[5]에서 그 개념을 차용하여 개발되었다. 사용자는 데이터 처리 로직을 Map과 Reduce라는 두 가지 함수로 정의하며, 프레임워크는 이 함수들을 클러스터의 수많은 노드에 자동으로 분배하고 실행하며, 장애 복구, 통신, 데이터 분산 등 복잡한 분산 처리의 세부 사항을 모두 처리한다.
처리 과정은 명확한 단계로 구분된다. 먼저 입력 데이터는 여러 조각으로 분할되어 클러스터의 노드들에 분산 저장된다. Map 단계에서는 각 노드가 할당받은 데이터 조각을 읽어 사용자 정의 map 함수를 적용하여 중간 키-값 쌍을 생성한다. 이후 셔플 단계에서 동일한 키를 가진 중간 값들은 네트워크를 통해 같은 리듀서 노드로 모인다. 마지막으로 Reduce 단계에서 각 리듀서는 키별로 그룹화된 값들의 리스트에 사용자 정의 reduce 함수를 적용하여 최종 결과를 계산하고 출력한다.
이 시스템의 주요 특징은 내결함성과 확장성에 있다. 작업은 수백, 수천 대의 상용 서버로 구성된 클러스터에서 실행되도록 설계되었으며, 개별 노드의 장애가 발생하더라도 프레임워크가 자동으로 해당 작업을 다른 정상 노드에서 재실행하여 전체 작업의 완료를 보장한다. 데이터는 HDFS에 저장되어 처리되며, 가능한 경우 계산을 데이터가 위치한 노드로 이동시켜 네트워크 대역폭을 절약하는 데이터 지역성 원칙을 따르도록 최적화되어 있다.
구성 요소 | 역할 |
|---|---|
JobTracker | 클라이언트로부터 작업을 받아 TaskTracker에 할당하고, 전체 작업의 상태를 모니터링하는 마스터 프로세스이다. |
TaskTracker | 각 노드에서 실행되어 JobTracker의 명령을 받아 실제 Map 또는 Reduce 작업을 실행하는 슬레이브 프로세스이다. |
JobClient | 사용자가 작업을 제출하고 JobTracker와 통신하는 인터페이스를 제공한다. |
Hadoop MapReduce는 단순하면서도 강력한 모델로, 초기 빅데이터 처리의 사실상 표준이 되었으며, 웹 인덱싱, 로그 분석, 대규모 데이터 집계 등 다양한 배치 처리 작업의 기반을 제공했다.
5.2. Apache Spark
5.2. Apache Spark
Apache Spark는 대규모 데이터 처리를 위한 오픈 소스 통합 컴퓨팅 엔진 및 클러스터 컴퓨팅 프레임워크이다. 메모리 내 처리를 중심으로 설계되어 디스크 기반 처리에 의존하는 전통적인 일괄 처리 시스템보다 훨씬 빠른 성능을 제공하는 것이 핵심 특징이다. Spark는 일괄 처리, 대화형 쿼리, 스트림 처리, 머신 러닝을 하나의 통합 스택으로 지원한다.
Spark의 핵심 추상화는 RDD와 DataFrame이다. RDD는 변경 불가능한 분산 객체 컬렉션으로, 장애 복구를 위한 탄력적 분산 데이터셋의 기반이 된다. 이후 도입된 DataFrame은 명명된 열을 가진 테이블 형태의 데이터 추상화로, 카탈리스트 옵티마이저와 퉁스텐 실행 엔진을 통해 더 높은 수준의 최적화와 성능을 제공한다. Spark의 아키텍처는 드라이버 프로그램, 클러스터 매니저, 그리고 다수의 익스큐터로 구성된다.
Spark는 다양한 언어 API를 제공하며, 주로 Scala, Java, Python, R을 지원한다. 작업 실행 흐름은 사용자 코드가 SparkContext를 통해 DAG로 변환되고, DAG 스케줄러와 태스크 스케줄러에 의해 세분화되어 클러스터의 익스큐터에 분배된다. 내결함성은 RDD의 라이니지 정보를 통해 데이터를 재계산하는 방식으로 구현된다.
특징 | 설명 |
|---|---|
처리 속도 | 메모리 내 처리로 인해 Hadoop MapReduce보다 최대 100배 빠른 성능을 보인다. |
사용 편의성 | Java, Scala, Python, R을 위한 고수준 API를 제공한다. |
실행 모드 | |
통합 스택 | Spark SQL, Spark Streaming, MLlib, GraphX 등 핵심 라이브러리를 포함한다. |
클러스터 관리 | 스탠드얼론 모드, Apache Mesos, Hadoop YARN, Kubernetes 위에서 실행될 수 있다. |
5.3. Apache Flink (배치 모드)
5.3. Apache Flink (배치 모드)
Apache Flink는 기본적으로 스트림 처리를 위한 분산 처리 프레임워크로 설계되었다. 그러나 Flink의 실행 엔진은 유한한 데이터 집합을 무한한 스트림의 특별한 경우로 간주하여, 동일한 런타임으로 배치 처리 작업도 효율적으로 수행할 수 있다[6]. 따라서 Flink의 배치 모드는 별도의 실행 엔진이 아닌, 스트림 처리의 기본 모델 위에 구현된 애플리케이션 실행 방식 중 하나이다.
배치 모드에서는 입력 데이터가 이미 완전히 존재하는 유한한 데이터 소스(예: HDFS의 파일, S3 버킷)로부터 읽힌다. Flink는 이 데이터를 '유한 스트림(Bounded Stream)'으로 처리하며, 데이터의 끝이 명확히 정의되어 있다. 이는 작업 스케줄링과 최종 결과 산출에 영향을 미친다. 예를 들어, 윈도우 연산이 명시적으로 정의되지 않아도 전체 데이터 세트를 하나의 윈도우로 간주하여 처리할 수 있으며, 모든 입력 데이터가 처리되면 최종 결과가 자동으로 출력된다.
Flink 배치 모드의 주요 최적화 기법은 데이터 지역성을 극대화하는 실행 계획 생성에 있다. 특히 shuffle 단계에서 네트워크 전송을 최소화하기 위해, 정렬 병합 조인이나 해시 조인과 같은 연산 전략을 사전에 계획한다. 또한, 메모리 관리와 직렬화에 있어서도 스트림 처리와는 다른 최적화를 적용하여 대용량 데이터를 디스크에 쓰는 빈도를 줄이고 처리 효율을 높인다.
처리 패러다임 | Flink 배치 모드의 특징 |
|---|---|
데이터 모델 | 유한 스트림(Bounded Stream)으로 처리 |
실행 트리거 | 데이터 세트 전체를 한 번에 처리, 종료 시 결과 출력 |
최적화 포인트 | 셔플 최소화, 실행 계획 사전 최적화, 메모리 기반 처리 |
주요 API |
|
DataSet API는 Flink의 전통적인 배치 처리 API였으나, 현재는 DataStream API를 배치 모드로 실행하거나, 더 높은 수준의 추상화를 제공하는 Table API 및 SQL을 사용하는 것이 권장된다. 이를 통해 사용자는 동일한 애플리케이션 로직을 배치와 스트림 처리 모두에 적용할 수 있는 통합 프로그래밍 모델의 이점을 얻는다.
6. 작업 처리 흐름
6. 작업 처리 흐름
일괄 처리 시스템에서 작업은 일반적으로 일련의 명확한 단계를 거쳐 처리된다. 사용자가 정의한 작업은 시스템에 제출된 후, 스케줄링과 자원 할당을 거쳐 실행되며, 최종 결과가 생성된다. 이 흐름은 대부분의 일괄 처리 시스템에서 공통적으로 발견되는 패턴이다.
일반적인 작업 처리 흐름은 다음과 같은 단계로 구성된다.
단계 | 주요 행위자 | 설명 |
|---|---|---|
작업 제출 | 사용자 / 클라이언트 | |
작업 큐잉 | 작업 관리자 | 제출된 작업은 대기 큐에 들어가 실행 순서를 기다린다. |
스케줄링 | 스케줄러 | 시스템의 가용 자원(예: CPU, 메모리, 디스크)을 평가하여 큐에 대기 중인 작업을 실행할 시점과 위치를 결정한다. |
자원 할당 | 스케줄러 / 자원 관리자 | 결정된 실행 계획에 따라 작업 실행에 필요한 컴퓨팅 자원(컨테이너 또는 Executor)을 할당한다. |
태스크 실행 | 실행 엔진 | 할당받은 자원에서 실제 작업 로직(예: 맵리듀스의 맵/리듀스 함수, Spark의 RDD 변환 연산)을 수행한다. |
상태 모니터링 | 작업 관리자 | 작업 실행 중 발생하는 상태(진행 중, 완료, 실패)를 추적하고 사용자에게 피드백을 제공한다. |
결과 수집 및 저장 | 실행 엔진 | 모든 태스크가 완료되면 산출된 결과 데이터를 지정된 저장소(예: HDFS, 데이터베이스, 로컬 파일 시스템)에 기록한다. |
작업 완료 및 정리 | 시스템 | 사용된 자원을 해제하고, 작업 로그를 정리하며, 최종 완료 상태를 보고한다. |
이 흐름은 선형적이지만, 특정 단계에서 실패가 발생하면 작업은 실패 처리되거나 설정에 따라 재시도를 수행한다. Hadoop MapReduce나 Apache Spark와 같은 시스템은 이 기본 흐름 위에 각각의 고유한 실행 모델과 장애 허용 메커니즘을 구현한다.
7. 최적화 기법
7. 최적화 기법
일괄 처리 시스템의 성능을 향상시키기 위한 주요 최적화 기법은 데이터 지역성 활용과 작업 병렬화이다. 이 두 가지는 대규모 데이터를 효율적으로 처리하는 데 핵심적인 역할을 한다.
데이터 지역성 최적화는 데이터가 저장된 위치에서 가까운 곳에서 작업을 실행하는 것을 목표로 한다. 데이터 전송은 네트워크 대역폭을 소모하고 처리 지연을 유발하기 때문에, 가능한 한 데이터 이동을 최소화하는 전략이 중요하다. 대표적인 시스템인 Hadoop의 HDFS는 데이터를 여러 블록으로 나누어 클러스터의 여러 노드에 분산 저장한다. YARN 스케줄러는 작업을 스케줄링할 때, 해당 데이터 블록을 보유한 노드 또는 동일한 랙 내의 노드에 작업을 할당하려고 시도한다. 이를 통해 네트워크를 통한 대규모 데이터 이동을 피하고, 로컬 디스크 I/O 성능을 활용하여 전체 처리 속도를 높일 수 있다.
작업 병렬화는 하나의 큰 작업을 여러 개의 독립적인 하위 작업으로 분할하여 동시에 실행하는 기술이다. 맵리듀스 프로그래밍 모델은 이 원리를 잘 보여주는데, 맵 단계에서는 입력 데이터를 여러 조각으로 나누어 병렬 처리하고, 셔플 단계를 거쳐 리듀스 단계에서 다시 병렬로 집계 작업을 수행한다. Apache Spark는 RDD라는 불변의 분산 데이터셋 개념을 도입하여 메모리 내에서 중간 결과를 캐싱함으로써 반복적인 작업이나 다단계 처리 파이프라인의 성능을 극대화한다. 작업을 효율적으로 병렬화하려면 데이터 분할 전략, 작업 간 의존성 관리, 그리고 각 작업에 적절한 양의 자원(CPU, 메모리)을 할당하는 것이 중요하다.
이러한 기법들은 단독으로 적용되기보다는 종합적으로 사용된다. 예를 들어, 데이터 지역성을 고려하여 작업을 노드에 분배한 후, 각 노드 내에서도 CPU 코어 수를 고려하여 태스크를 병렬로 실행한다. 또한, 데이터 압축을 적용하여 디스크 I/O나 네트워크 전송 시간을 줄이거나, 불필요한 데이터 셔플링을 최소화하는 것도 일반적인 최적화 방법에 속한다[7].
7.1. 데이터 지역성 활용
7.1. 데이터 지역성 활용
데이터 지역성 활용은 일괄 처리 시스템의 성능을 극대화하기 위한 핵심 최적화 기법 중 하나이다. 이 기법은 처리할 데이터가 저장된 물리적 위치와 그 데이터를 처리하는 컴퓨팅 노드를 가능한 한 가깝게 배치함으로써 네트워크를 통한 데이터 이동을 최소화하는 원리이다. 대규모 데이터를 처리할 때 데이터 전송에 소요되는 네트워크 대역폭과 지연 시간은 전체 작업 실행 시간의 주요 병목 지점이 될 수 있다. 따라서 데이터가 이미 로컬 디스크에 존재하는 노드에서 작업을 실행하도록 작업 스케줄러가 배치하는 것이 효율적이다.
이 개념은 Hadoop의 HDFS와 MapReduce 프레임워크에서 명확하게 구현되었다. HDFS는 대용량 파일을 여러 블록으로 나누어 클러스터의 여러 노드에 분산 저장한다. MapReduce 작업이 제출되면, 리소스 매니저는 각 데이터 블록의 위치 정보를 확인하고, 가능한 한 그 블록을 보유한 데이터 노드에서 해당 맵 태스크를 실행하도록 스케줄링한다. 이를 '노드 지역성', '랙 지역성' 등으로 구분하여 최적의 실행 위치를 선정한다. 데이터 지역성을 확보하지 못한 경우, 네트워크를 통해 원격 데이터를 읽어야 하므로 처리 속도가 현저히 저하된다.
데이터 지역성 최적화의 효과는 처리 데이터의 규모가 클수록 더욱 두드러진다. 시스템은 일반적으로 다음 세 가지 수준의 지역성을 우선순위에 따라 추구한다.
지역성 수준 | 설명 | 우선순위 |
|---|---|---|
노드 지역성 | 데이터가 있는 동일한 노드에서 태스크 실행 | 가장 높음 |
랙 지역성 | 데이터가 있는 노드와 동일한 네트워크 랙 내의 다른 노드에서 실행 | 중간 |
오프랙 지역성 | 다른 네트워크 랙의 노드에서 실행, 데이터는 네트워크를 통해 전송 | 가장 낮음 |
이러한 스케줄링 정책은 데이터 센터의 네트워크 토폴로지와 자원 가용성을 고려하여, 불필요한 크로스랙 트래픽을 줄이고 전체 클러스터의 처리 처리량을 향상시킨다. 현대의 분산 컴퓨팅 프레임워크는 자원 관리자와 협력하여 데이터 지역성을 최대한 보장하면서도 클러스터 자원의 균형 있는 활용 사이에서 최적의 결정을 내린다.
7.2. 작업 병렬화
7.2. 작업 병렬화
작업 병렬화는 일괄 처리 시스템의 성능을 극대화하기 위한 핵심 기법 중 하나이다. 이는 하나의 큰 작업을 여러 개의 독립적이거나 약하게 결합된 하위 작업으로 분할하여, 여러 컴퓨팅 자원에서 동시에 실행하는 것을 의미한다. 시스템의 전체 처리량을 높이고 작업 완료 시간을 단축하는 데 목적이 있다.
병렬화는 일반적으로 데이터와 처리 로직 두 축에서 이루어진다. 데이터 병렬화는 입력 데이터를 여러 파티션으로 나누어 각 파티션에 대해 동일한 처리 함수를 적용하는 방식이다. 대표적인 예로 Hadoop MapReduce의 맵 단계가 있다. 작업 병렬화는 서로 다른 함수나 작업을 여러 노드에서 동시에 실행하는 방식으로, DAG 기반 스케줄러를 사용하는 Apache Spark나 Apache Tez에서 효과적으로 구현된다.
효과적인 작업 병렬화를 구현하기 위해서는 몇 가지 고려사항이 필요하다. 첫째, 작업 간 의존성을 최소화하여 독립적으로 실행 가능한 단위로 분할해야 한다. 둘째, 데이터 분할과 작업 분배 과정에서 발생하는 오버헤드가 병렬화로 인한 이득을 상쇄하지 않도록 균형을 잡아야 한다. 셋째, 자원 관리 시스템과 긴밀하게 연동되어 가용한 CPU, 메모리, 디스크, 네트워크 대역폭을 효율적으로 활용할 수 있어야 한다.
병렬화 유형 | 설명 | 대표적 구현 예시 |
|---|---|---|
데이터 병렬화 | 동일한 작업을 데이터의 서로 다른 부분에 적용 | MapReduce의 맵 태스크 |
작업 병렬화 | 서로 다른 작업을 동시에 실행 | |
파이프라인 병렬화 | 한 작업의 출력이 다음 작업의 입력으로 연속적으로 연결되어 동시 실행 | Flink 배치 작업의 체이닝 |
이러한 기법들은 대규모 데이터 분석, ETL 프로세스, 머신 러닝 모델 학습과 같은 계산 집약적이고 데이터 중심의 작업을 처리할 때 필수적이다.
8. 사용 사례
8. 사용 사례
일괄 처리 시스템은 대량의 데이터를 한꺼번에 모아 처리하는 데 특화되어 있으며, 특히 데이터가 이미 완전히 수집된 상태에서 분석이나 변환 작업을 수행해야 하는 다양한 시나리오에서 널리 활용된다.
가장 대표적인 사용 사례는 대규모 데이터 분석이다. 웹 서버 로그, 센서 데이터, 금융 거래 기록과 같은 테라바이트 또는 페타바이트 규모의 정적 데이터셋을 대상으로 집계, 통계 계산, 패턴 탐색 등의 작업을 수행한다. 예를 들어, 전자상거래 회사는 하루 동안 발생한 모든 사용자 클릭 로그를 수집한 뒤, 자정 이후에 일괄 처리 작업을 실행하여 인기 상품 리포트나 사용자 행동 트렌드를 분석한다. 이러한 분석은 Hadoop MapReduce나 Apache Spark와 같은 프레임워크를 통해 이루어진다.
두 번째 주요 사례는 ETL 프로세스다. ETL(추출, 변환, 적재)은 여러 소스 시스템에서 데이터를 추출(Extract)하여, 표준 형식으로 변환(Transform)한 후, 데이터 웨어하우스나 데이터 레이크 같은 저장소에 적재(Load)하는 과정이다. 일괄 처리는 주기적으로(예: 매일 밤) 대량의 원본 데이터를 정해진 비즈니스 규칙에 따라 정제하고 구조화하는 데 적합하다. 이는 다음 날의 의사 결정이나 비즈니스 인텔리전스 도구를 위한 깨끗한 데이터 기반을 마련한다.
또 다른 중요한 사례는 정기적인 보고서 생성이다. 매일, 매주 또는 매월 생성해야 하는 판매 보고서, 재무제표, 운영 현황 대시보드 등은 일괄 처리 작업의 전형적인 결과물이다. 시스템은 해당 기간 동안 누적된 모든 거래 데이터를 처리하여 미리 정의된 형식의 리포트를 자동으로 생성하고 배포한다. 이는 수동 작업을 대체하여 정확성과 효율성을 높인다.
사용 사례 | 처리 대상 데이터 예시 | 일반적인 실행 주기 | 활용 시스템 예시 |
|---|---|---|---|
대규모 데이터 분석 | 웹 로그, 센서 데이터 | 일간, 주간 | Hadoop, Spark |
ETL 프로세스 | 운영 데이터베이스 스냅샷 | 일간, 실시간 근접(마이크로 배치) | Apache Airflow, 커스텀 스크립트 |
보고서 생성 | 거래 데이터, 재무 데이터 | 시간별, 일간, 월간 | SQL 배치 쿼리, BI 도구 내부 엔진 |
8.1. 대규모 데이터 분석
8.1. 대규모 데이터 분석
일괄 처리 시스템은 방대한 양의 정적 데이터를 한꺼번에 수집, 변환, 분석하는 데 적합한 패러다임이다. 대규모 데이터 분석은 이러한 시스템의 가장 대표적인 사용 사례로, 데이터 웨어하우스 구축, 비즈니스 인텔리전스, 로그 분석 등 다양한 분야에서 핵심 역할을 한다. 분석 작업은 일반적으로 하루나 한 주 같은 정해진 주기로 실행되며, ETL 과정을 통해 원천 데이터를 정제하고 통합된 형태로 변환한 후 복잡한 분석 쿼리를 수행한다.
주요 분석 작업 유형은 다음과 같다.
분석 유형 | 설명 | 예시 |
|---|---|---|
집계 분석 | 대량의 데이터를 요약하여 통계치를 산출한다. | 일별 매출 합계, 지역별 평균 고객 연령 |
일괄 예측 | 과거 데이터를 기반으로 머신 러닝 모델을 훈련하고 미래 값을 예측한다. | 다음 분기 제품 수요 예측, 고객 이탈 가능성 점수화 |
패턴 탐색 | 데이터 내에 숨겨진 연관성이나 비정상적인 패턴을 발견한다. | 시장 바스켓 분석[8], 이상 거래 탐지 |
이러한 분석은 Hadoop MapReduce, Apache Spark, Apache Hive와 같은 프레임워크를 통해 수행된다. 특히 맵리듀스 모델은 데이터를 여러 노드에 분산시켜 병렬 처리함으로써 단일 컴퓨터로는 처리 불가능한 페타바이트 규모의 데이터셋을 분석할 수 있게 한다. 분석 결과는 주로 보고서, 대시보드, 또는 다른 시스템에서 활용할 수 있는 구조화된 데이터셋 형태로 출력된다.
대규모 데이터 분석을 위한 일괄 처리의 장점은 처리량이 크고 비용 효율적이라는 점이다. 한 번에 많은 데이터를 처리하므로 스트림 처리에 비해 단위 데이터당 오버헤드가 낮다. 또한 작업 실행 전에 모든 입력 데이터를 사용할 수 있기 때문에 전역 최적화가 가능하고, 재현 가능한 결과를 얻기 쉬워 데이터 과학 실험에 유리하다. 그러나 실시간성이 요구되는 분석에는 적합하지 않다는 한계를 가진다.
8.2. ETL 프로세스
8.2. ETL 프로세스
ETL은 데이터를 추출(Extract), 변환(Transform), 적재(Load)하는 과정을 의미하는 데이터 처리 패턴이다. 이는 서로 다른 소스 시스템에서 데이터를 가져와 분석이나 보고에 적합한 형태로 변환한 후, 데이터 웨어하우스나 데이터 레이크 같은 목적지 저장소에 체계적으로 로드하는 작업을 포함한다. 일괄 처리 시스템은 이러한 ETL 작업을 자동화하고 대규모로 효율적으로 실행하기 위한 핵심 플랫폼 역할을 한다.
ETL 프로세스는 일반적으로 정해진 일정(예: 매일 밤, 매주 일요일)에 따라 실행되는 일괄 작업으로 구현된다. 추출 단계에서는 관계형 데이터베이스, 로그 파일, CSV 파일 등 다양한 소스로부터 원본 데이터를 읽어온다. 변환 단계에서는 데이터 정제, 형식 표준화, 중복 제거, 비즈니스 규칙 적용, 집계 계산 등 복잡한 로직이 수행되어 데이터의 품질과 일관성을 보장한다. 최종 적재 단계에서는 처리된 데이터가 분석 시스템에 로드되어 비즈니스 인텔리전스 도구나 데이터 과학 애플리케이션에서 사용할 수 있게 된다.
처리 단계 | 주요 작업 | 일괄 처리 시스템에서의 역할 |
|---|---|---|
추출(Extract) | 소스 시스템에서 원시 데이터 읽기 | 대량의 데이터를 효율적으로 분산 읽기 |
변환(Transform) | 데이터 정제, 표준화, 집계, 조인 | |
적재(Load) | 목표 저장소에 변환된 데이터 쓰기 | 트랜잭션 일관성을 유지하며 대량 쓰기 수행 |
Apache Spark와 Apache Flink 같은 현대적 일괄 처리 프레임워크는 메모리 내 처리와 최적화된 실행 엔진을 통해 전통적인 ETL 도구보다 훨씬 빠른 처리 속도를 제공한다. 이를 통해 수 테라바이트 이상의 데이터에 대한 복잡한 변환 로직도 수 시간 내에 완료할 수 있다. 결과적으로, 일괄 ETL은 기업이 과거 데이터를 기반으로 한 통합된 보고서 생성, 재무 결산, 머신러닝 모델 학습용 데이터 세트 구축 등의 업무를 신뢰성 있게 수행할 수 있는 기반을 마련해준다.
8.3. 보고서 생성
8.3. 보고서 생성
보고서 생성은 일괄 처리 시스템의 대표적인 사용 사례 중 하나이다. 이는 대량의 원시 데이터를 수집, 처리, 가공하여 정기적이고 구조화된 형태의 문서나 시각화 자료를 만들어내는 과정을 의미한다. 일반적으로 매일, 매주, 매월 같은 정해진 주기로 실행되며, 과거 특정 기간 동안 누적된 데이터를 대상으로 집계, 요약, 분석을 수행한다.
보고서 생성 작업의 전형적인 흐름은 ETL 프로세스와 유사하다. 먼저 데이터베이스, 로그 파일, 트랜잭션 기록 등 다양한 소스에서 원본 데이터를 추출한다. 이후 데이터 정제, 형식 변환, 키-값 매핑 등의 변환 작업을 거친다. 마지막으로 비즈니스 요구사항에 맞춰 집계 함수를 적용하거나 특정 기준으로 그룹화하여 최종 보고서 데이터를 생성하고, 이를 CSV, PDF, 대시보드 등의 형태로 출력한다.
보고서 유형 | 처리 데이터 특성 | 일반적인 생성 주기 | 사용 기술 예시 |
|---|---|---|---|
매출/영업 보고서 | 트랜잭션 데이터, 주문 기록 | 일간, 주간, 월간 | Apache Spark, SQL 쿼리 |
재무 결산 보고서 | 회계 데이터, 원장 기록 | 분기별, 연간 | Hadoop MapReduce, 전문 재무 소프트웨어 |
사용자 행동 분석 보고서 | 웹/앱 로그, 클릭스트림 데이터 | 일간, 주간 | |
인벤토리/재고 보고서 | 창고 관리 시스템 데이터, 공급망 기록 | 주간, 월간 | 배치 SQL 작업 |
이러한 작업은 처리할 데이터의 규모가 크고, 실행 시간이 길며, 결과의 정확성이 매우 중요하기 때문에 일괄 처리 시스템의 장점을 잘 활용한다. 시스템은 작업이 완료될 때까지 중단 없이 실행되어 일관된 결과를 보장하며, 실패 시 재시작하거나 이전 단계부터 재처리하는 메커니즘을 통해 신뢰성을 확보한다. 또한, 작업 스케줄러를 이용해 비즈니스 활동이 적은 시간대에 자동으로 실행되도록 설정하여 자원 활용도를 최적화한다.
9. 스트림 처리와의 비교
9. 스트림 처리와의 비교
스트림 처리 시스템은 데이터를 연속적인 흐름으로 실시간 처리하는 반면, 일괄 처리 시스템은 미리 수집된 데이터 집합을 한 번에 처리합니다. 이는 근본적인 데이터 처리 모델의 차이에서 비롯됩니다. 일괄 처리는 대규모 정적 데이터 세트를 대상으로 복잡한 변환과 집계를 수행하는 데 최적화되어 있으며, 높은 처리량과 효율성을 목표로 합니다. 반면 스트림 처리는 무한히 들어오는 데이터 스트림을 실시간 또는 준실시간으로 분석하여 낮은 지연 시간을 보장합니다.
두 시스템은 처리 대상 데이터의 상태와 시간적 특성에서 명확히 구분됩니다. 다음 표는 주요 차이점을 비교한 것입니다.
비교 항목 | 일괄 처리 시스템 | 스트림 처리 시스템 |
|---|---|---|
데이터 범위 | 유한한 데이터 세트(과거 데이터) | 무한한 데이터 스트림(실시간 데이터) |
처리 지연 | 높음(수 분 ~ 수 시간) | 낮음(수 밀리초 ~ 수 초) |
처리 트리거 | 주기적 또는 수동 작업 제출 | 이벤트 도착 시 즉시 처리 |
주요 목표 | 높은 처리량, 정확성, 종합적 분석 | 낮은 지연 시간, 실시간 응답, 연속적 모니터링 |
상태 관리 | 작업 단위의 상태 관리 | 연산자의 장기적 상태 관리 필요 |
대표적 시스템 | Hadoop MapReduce, Apache Spark (배치) |
아키텍처와 사용 사례도 이 차이를 반영합니다. 일괄 처리는 ETL 파이프라인, 오프라인 데이터 분석, 일일/주간 보고서 생성과 같이 결과의 완전성과 정확성이 중요한 배치 작업에 적합합니다. 스트림 처리는 사기 탐지, 실시간 대시보드, IoT 센서 데이터 모니터링, 주식 거래 분석과 같이 즉각적인 인사이트와 행동이 요구되는 시나리오에 사용됩니다.
현대의 데이터 처리 아키텍처에서는 람다 아키텍처나 카파 아키텍처와 같이 두 방식을 결합하여 일괄 처리의 정확성과 스트림 처리의 실시간성을 동시에 달성하려는 접근법도 등장했습니다. 특히 Apache Spark와 Apache Flink와 같은 프레임워크는 통합된 API를 통해 배치와 스트림 처리 모두를 지원하는 추세를 보이고 있습니다.
