상위: Flink
요약
Flink는 진정한 실시간 처리(True Streaming)를, Spark는 마이크로 배치 처리를 제공합니다. Flink는 밀리초 수준의 초저지연과 복잡한 상태 관리에 강하고, Spark는 배치+스트리밍 통합과 ML 파이프라인 연계에 유리합니다.
처리 방식 비교
| 항목 | Spark Streaming | Apache Flink |
|---|---|---|
| 💡 처리 방식 | 마이크로 배치 (Micro-batch) | 진짜 실시간 (True streaming / record-by-record) |
| 🧱 처리 단위 | 일정 시간 단위로 묶음 (RDD 단위) | 한 건(레코드) 단위로 바로 처리 |
| 🕒 지연 시간 | 수 초 ~ 수 밀리초 (batch interval에 따라) | 몇 밀리초 수준 (진짜 Low Latency) |
| 💥 지연 민감도 | 지연 OK한 처리에 적합 (로그, ETL 등) | 실시간 반응이 중요한 작업에 적합 (실시간 모니터링, fraud detection 등) |
| 💽 상태 관리 | RDD 기반, 상태 처리 불편함 | Keyed State, Window State 등 상태 기반 연산이 강력 |
| 💾 체크포인트 | 있음 (Checkpoint, WAL 기반) | Exactly-Once 지원, Checkpoint, Savepoint, Backpressure 조절 기능 우수 |
| 🧪 트리거 기반 | 트리거 주기마다 처리 | 이벤트가 들어오는 즉시 반응 |
| 🧠 복잡한 처리 | ML 파이프라인, 대규모 집계에 유리 | 스트림 조인, 이벤트 타임 처리에 강함 |
| ✅ 적합한 예시 | 데이터 웨어하우스 적재, 로그 수집, 마이크로 배치 ETL | 실시간 알림, 온라인 금융 이상 탐지, IoT 스트리밍 |
상세 비교
| 항목 | Apache Flink | Apache Spark Structured Streaming |
|---|---|---|
| 지연 시간 | 수 밀리초 수준 (초저지연) | 수십~수백 밀리초 (실시간성 양호) |
| 처리 방식 | 이벤트 기반 (True Streaming) | 마이크로 배치 기반 (Micro-batching) |
| 정확성 보장 | 기본 Exactly-once | 기본 At-least-once, 설정 시 Exactly-once 가능 |
| API 지원 | Java, Scala, Table API, SQL | Python(PySpark), Scala, SQL, R 등 풍부한 API |
| 생태계 통합 | Flink 자체 생태계 중심 | Spark MLlib, GraphX, Delta Lake 등과 통합 용이 |
| 학습 난이도 | 비교적 높은 진입 장벽 | PySpark 등으로 시작하기 쉬움 |
| 확장성 | 실시간 처리에 최적화 | 실시간 + 배치 통합 파이프라인 구성에 용이 |
| 대표 사용 예시 | Fraud detection, 실시간 로그 분석 | 로그 집계, 클릭스트림 분석, ML 파이프라인 연계 |
선택 기준
Flink를 선택해야 할 때
1. 초저지연 요구사항
지연 시간 < 100ms
→ Flink 선택
예시:
- 실시간 Fraud Detection (금융)
- 실시간 입찰 시스템 (AdTech)
- 게임 서버 실시간 분석
2. 복잡한 이벤트 처리
- 여러 스트림 조인
- 복잡한 윈도우 연산
- 패턴 매칭 (CEP - Complex Event Processing)
예시:
- 사용자 행동 패턴 실시간 감지
- IoT 센서 데이터 복합 분석
3. 강력한 상태 관리 필요
- Keyed State로 사용자별 상태 유지
- 장시간 윈도우 (수시간~수일)
- Exactly-once 보장 필수
예시:
- 실시간 세션 분석
- 사용자별 실시간 집계
Spark를 선택해야 할 때
1. 배치 + 스트리밍 통합
배치 + 실시간 모두 필요
→ Spark 선택 (같은 API 사용)
예시:
- 배치 ETL + 실시간 대시보드
- 과거 데이터 재처리 + 실시간 업데이트
2. ML/GraphX 통합
- Spark MLlib 활용
- GraphX로 그래프 분석
- Delta Lake 통합
예시:
- 실시간 추천 시스템 (MLlib 연계)
- 실시간 데이터 레이크 적재
3. 낮은 진입 장벽
- Python 우선 (PySpark)
- 기존 Spark 인프라 활용
- 풍부한 레퍼런스
예시:
- 데이터 분석팀의 실시간 분석
- 빠른 프로토타이핑
성능 비교
지연 시간 (Latency)
Flink: 1~10ms
Spark: 100~1000ms
처리량 (Throughput)
소규모 데이터: 비슷
대규모 데이터: Spark가 약간 우위 (배치 최적화)
리소스 사용
Flink: 상태 관리로 메모리 많이 사용
Spark: 배치 단위로 메모리 효율적 관리
실전 예시
Flink가 적합한 시나리오
실시간 Fraud Detection
# Flink: 거래 즉시 분석
transactions.keyBy("user_id") \
.process(FraudDetectionFunction()) \
.filter(lambda x: x.is_fraud) \
.addSink(AlertSink())
- 요구사항: 100ms 이내 탐지
- Flink: ✅ 가능 (record-by-record)
- Spark: ❌ 어려움 (마이크로 배치)
복잡한 CEP
# Flink: 패턴 매칭
pattern = Pattern.begin("start") \
.where(lambda x: x.event_type == "login") \
.next("middle") \
.where(lambda x: x.event_type == "purchase") \
.within(Time.minutes(5))
- 요구사항: 복잡한 이벤트 순서 매칭
- Flink: ✅ 강력한 CEP 라이브러리
- Spark: ❌ CEP 지원 약함
Spark가 적합한 시나리오
배치 + 스트리밍 통합
# Spark: 동일한 DataFrame API
# 배치
df_batch = spark.read.parquet("historical_data")
# 스트리밍 (같은 API!)
df_stream = spark.readStream.format("kafka").load()
# 동일한 변환 로직 적용
def transform(df):
return df.filter(...).groupBy(...)
result_batch = transform(df_batch)
result_stream = transform(df_stream)
- 요구사항: 배치/스트리밍 코드 통일
- Spark: ✅ 완벽한 통합
- Flink: △ Batch/Stream API 분리
ML 파이프라인 연계
# Spark: MLlib 직접 사용
streaming_df.join(ml_model.transform(features))
- 요구사항: 실시간 ML 추론
- Spark: ✅ MLlib 직접 통합
- Flink: △ 외부 모델 호출 필요
비용 고려
Flink
- 장점: 효율적인 리소스 사용 (정확한 처리량만큼)
- 단점: 상태 관리로 메모리 비용 증가
Spark
- 장점: 배치 최적화로 대용량 처리 효율적
- 단점: 마이크로 배치로 리소스 낭비 가능
결론
요약
실시간성 중요 → Flink
- Fraud detection
- 실시간 알림
- CEP
통합 파이프라인 중요 → Spark
- 배치 + 스트리밍
- ML 연계
- 데이터 레이크
하이브리드 접근
많은 기업이 두 가지를 함께 사용:
- Flink: 실시간 알림, Fraud detection
- Spark: 배치 ETL, ML 학습, 대시보드
관련 주제
- Streaming Architecture - 스트리밍 아키텍처 설계
- Kafka Integration - Kafka 통합 패턴
- Structured Streaming - Spark 스트리밍