contents
아파치 플링크는 유한하거나 무한한 데이터 스트림에 대해 실시간 상태 기반(stateful) 연산을 수행하기 위한 오픈소스 분산 스트림 처리 프레임워크입니다. 핵심 특징은 데이터를 이벤트 단위로 낮은 지연 시간과 높은 처리량으로 처리하는 능력이며, 이 때문에 진정한 실시간 애플리케이션을 위한 최고의 선택지로 꼽힙니다.
비유: 만약 배치 처리가 하루가 끝날 때 주차장에 있는 모든 차를 세는 것이라면, 플링크는 고속도로에 스마트 톨게이트를 설치하여 차들이 지나갈 때마다 실시간으로 세고 분석하며, 계속해서 총계를 업데이트하고 비정상적인 교통 패턴을 식별하는 것과 같습니다.
플링크가 해결하는 핵심 문제
전통적인 데이터 처리는 배치 처리(하둡 맵리듀스 등)가 지배적이었습니다. 이 접근 방식은 일정 기간 동안 데이터를 수집한 후, 큰 배치(batch)로 처리하여 결과를 생성합니다. 문제는 지연 시간이 높다는 것, 즉 통찰력이 항상 과거의 것이 된다는 점입니다.
아파치 스파크와 같은 일부 프레임워크는 스트림을 작은 배치로 잘라 처리하는 마이크로 배치(micro-batching) 방식을 도입했습니다. 이는 지연 시간을 줄여주지만, 여전히 진정한 이벤트 단위 처리는 아닙니다.
플링크는 진정한 스트리밍 우선 엔진으로 설계되었습니다. 각 이벤트가 도착하는 즉시 수집하고 처리하여, 즉각적이고 낮은 지연 시간의 통찰력이 필요한 애플리케이션을 가능하게 합니다.
플링크의 핵심 개념
- 스트림 (Stream): 무한할 수 있는, 연속적인 데이터 레코드(이벤트)의 시퀀스입니다.
- 이벤트 (Event): 스트림 내의 단일 레코드 또는 데이터 포인트입니다 (예: 사용자 클릭, 센서 판독값, 금융 거래).
- 연산자 (Operator / Transformation): 하나 이상의 데이터 스트림을 새로운 데이터 스트림으로 변환하는 함수입니다. 예로는
map,filter,keyBy,window가 있습니다. - 소스 & 싱크 (Source & Sink): 소스는 플링크 작업이 데이터를 수집하는 곳입니다(예: 카프카, 키네시스, 파일). 싱크는 플링크가 결과를 보내는 곳입니다(예: 다른 카프카 토픽, 데이터베이스, 파일 시스템).
- 상태 (State): 이것이 플링크의 가장 중요한 개념입니다. 상태는 연산자의 메모리입니다. 각 이벤트가 개별적으로 처리되기 때문에, 연산자는 과거 이벤트의 정보(예: 누적 카운트, 합계)를 기억해야 합니다. 플링크는 강력하고 내결함성 있는 상태 관리 기능을 제공합니다.
- 윈도우 (Window): 무한한 스트림을 시간이나 개수를 기반으로 유한한 "윈도우"로 그룹화하여 처리하는 메커니즘입니다. 일반적인 유형은 다음과 같습니다.
- 텀블링 윈도우 (Tumbling Window): 고정된 크기의, 겹치지 않는 윈도우 (예: 매 1분마다).
- 슬라이딩 윈도우 (Sliding Window): 고정된 크기의, 겹치는 윈도우 (예: 10초마다 슬라이드하는 1분짜리 윈도우).
- 세션 윈도우 (Session Window): 비활성 기간으로 구분된 활동 기간별로 이벤트를 그룹화합니다.
플링크 아키텍처
플링크 애플리케이션은 클러스터 위에서 분산 시스템으로 실행됩니다.
- 잡 매니저 (JobManager - 두뇌 🧠): 분산 실행을 조율하는 마스터 프로세스입니다. 다음을 담당합니다.
- 플링크 잡(job) 수신.
- 개별 태스크를 태스크 매니저에 스케줄링.
- 장애 발생 시 체크포인트와 복구 조율.
- 태스크 매니저 (TaskManager - 근육 💪): 워커 프로세스입니다. 각 태스크 매니저는 여러 개의 태스크 슬롯을 가집니다. 태스크 슬롯은 플링크에서 리소스를 할당하는 가장 작은 단위입니다. 태스크 매니저는 다음을 담당합니다.
- 할당된 실제 태스크(연산자) 실행.
- 태스크 간의 메모리 및 데이터 교환 관리.
- 태스크 상태를 잡 매니저에게 보고.
플링크 API (사용 방법)
플링크는 다양한 추상화 수준에 맞춰 계층화된 API 세트를 제공합니다.
- SQL & 테이블 API (최상위 레벨): 표준 SQL 쿼리나 플루언트(fluent)한 언어 통합 API를 사용하여 데이터 처리 작업을 정의할 수 있는 선언적 API입니다. 데이터 분석에 이상적이며 사용하기 가장 쉽습니다.
- 데이터스트림 API (핵심 레벨): 스트림 처리에 가장 널리 사용되는 API입니다. 데이터 스트림에 대한 완전한 제어권을 제공하며,
map,keyBy,window,apply와 같은 변환을 사용하여 복잡한 로직을 구현할 수 있습니다.
// 예시: 5초 윈도우 내의 이벤트 카운트
stream
.keyBy(event -> event.getUserId())
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.sum("value");
- 프로세스 함수 (ProcessFunction - 최하위 레벨): 상태와 시간 모두에 대한 세밀한 제어를 제공하는 저수준 API입니다. 이를 통해 다른 API로는 표현하기 어려운 매우 복잡한 이벤트 기반 애플리케이션을 구현할 수 있습니다.
플링크를 특별하게 만드는 주요 특징
- 진정한 스트리밍 (이벤트 단위 처리): 아키텍처가 이벤트 도착 즉시 처리하도록 설계되어 가능한 가장 낮은 지연 시간을 제공합니다.
- 상태 기반 처리 및 내결함성 (정확히 한 번 처리 보장): 이것이 플링크의 킬러 기능입니다. 플링크는 크고 복잡한 상태를 유지할 수 있으며, 장애 발생 시 상태가 복원되고 어떤 이벤트도 손실되거나 두 번 처리되지 않음을 보장합니다. 이는 체크포인트라는 경량 스냅샷 메커니즘을 통해 달성됩니다.
- 이벤트 시간 vs. 처리 시간: 플링크는 이벤트가 실제로 소스에서 발생한 시간인 이벤트 시간을 일급 기능으로 지원합니다. 이는 실제 스트림에서 흔히 발생하는 순서가 맞지 않는 데이터로부터 정확한 결과를 얻는 데 매우 중요합니다.
- 높은 처리량: 플링크는 고성능을 위해 설계되었으며, 평범한 하드웨어에서도 초당 수백만 개의 이벤트를 처리할 수 있습니다.
일반적인 사용 사례
- 실시간 분석: 라이브 대시보드 및 모니터링 시스템 구동.
- 사기 및 이상 탐지: 거래나 사용자 행동의 실시간 스트림에서 비정상적인 패턴 식별.
- 실시간 ETL (추출, 변환, 적재): 카프카와 같은 소스에서 데이터를 수집, 정제, 보강하여 데이터 웨어하우스나 다른 시스템에 적재.
- 이벤트 기반 애플리케이션: 실시간 추천이나 알림과 같이 들어오는 이벤트 스트림에 반응하는 애플리케이션 구축.
플링크 vs. 아파치 스파크
| 특징 | 아파치 플링크 | 아파치 스파크 |
|---|---|---|
| 처리 모델 | 진정한 스트리밍 (한 번에 하나의 이벤트) | 마이크로 배치 (작은 배치 처리) |
| 지연 시간 | 밀리초 단위 | 수백 밀리초 ~ 초 단위 |
| 상태 관리 | 고급, 이벤트별 상태 관리 | 더 단순한, 배치 지향적 상태 관리 |
| 주요 초점 | 스트리밍 우선, 배치는 특수한 경우로 취급 | 배치 우선, 스트리밍은 확장 기능으로 취급 |
references