전체 그래프
Flink

Flink vs Spark

data-engineeringflinksparkcomparison

상위: Flink

요약

Flink는 진정한 실시간 처리(True Streaming)를, Spark는 마이크로 배치 처리를 제공합니다. Flink는 밀리초 수준의 초저지연과 복잡한 상태 관리에 강하고, Spark는 배치+스트리밍 통합과 ML 파이프라인 연계에 유리합니다.

처리 방식 비교

항목Spark StreamingApache 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 FlinkApache Spark Structured Streaming
지연 시간수 밀리초 수준 (초저지연)수십~수백 밀리초 (실시간성 양호)
처리 방식이벤트 기반 (True Streaming)마이크로 배치 기반 (Micro-batching)
정확성 보장기본 Exactly-once기본 At-least-once, 설정 시 Exactly-once 가능
API 지원Java, Scala, Table API, SQLPython(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 학습, 대시보드

관련 주제