아파치 스파크 Structured Streaming

IT 위키

아파치 스파크 Structured Streaming은 아파치 스파크에서 제공하는 고수준 스트리밍 처리 엔진으로, 스트리밍 데이터를 배치 처리처럼 선언적으로 다룰 수 있도록 설계된 API이다. DStream 기반의 기존 스트리밍 모델보다 간단하고 강력하며, DataFrame, Dataset API를 그대로 사용할 수 있다.

1 개념[편집 | 원본 편집]

  • Structured Streaming은 스트리밍을 마치 정적인 테이블처럼 처리하는 continuous incremental query 모델을 기반으로 함
  • 입력 스트림을 테이블로 간주하고, SQL 또는 DataFrame 쿼리를 통해 연속적으로 처리
  • 결과는 출력 싱크(sink)에 주기적으로 업데이트됨

2 특징[편집 | 원본 편집]

  • DataFrame / Dataset 기반 처리
  • Catalyst Optimizer와 Tungsten 엔진을 통한 고속 최적화
  • 장애 발생 시 정확히 한 번 처리(exactly-once semantics) 보장
  • Stateful Streaming, 윈도우 연산, 워터마크 기반 이벤트 타임 처리 지원
  • Kafka, 소켓, 파일, Delta Lake 등 다양한 소스 및 싱크와 통합 가능

3 처리 흐름[편집 | 원본 편집]

  1. 입력 소스 → 스트리밍 DataFrame으로 읽기
  2. SQL/DataFrame 연산 수행
  3. 출력 싱크로 지속적으로 쓰기

4 예시[편집 | 원본 편집]

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split

spark = SparkSession.builder.appName("StructuredNetworkWordCount").getOrCreate()

lines = spark.readStream.format("socket") \
        .option("host", "localhost") \
        .option("port", 9999).load()

words = lines.select(explode(split(lines.value, " ")).alias("word"))
wordCounts = words.groupBy("word").count()

query = wordCounts.writeStream \
        .outputMode("complete") \
        .format("console") \
        .start()

query.awaitTermination()

5 출력 모드[편집 | 원본 편집]

  • append: 새로 추가된 행만 출력
  • update: 변경된 행만 출력
  • complete: 전체 결과를 매번 출력

6 상태 관리[편집 | 원본 편집]

  • groupBy, 윈도우 연산 등을 사용할 경우 내부적으로 상태(state)를 유지
  • 정확히 한 번 처리 보장을 위해 checkpointLocation 설정이 필요함
  • 체크포인팅과 유사한 개념으로 관리됨

7 장점[편집 | 원본 편집]

  • 배치와 스트리밍을 동일한 코드로 처리 가능
  • SQL로 복잡한 스트리밍 쿼리 구성 가능
  • 정확히 한 번 처리 보장
  • 장애 발생 시 상태 복구 가능

8 단점[편집 | 원본 편집]

  • 낮은 수준의 제어가 필요한 경우 유연성 제한
  • 설정 복잡도 증가 (checkpoint, trigger 등)

9 같이 보기[편집 | 원본 편집]

10 참고 문헌[편집 | 원본 편집]