아파치 스파크 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 처리 흐름[편집 | 원본 편집]
- 입력 소스 → 스트리밍 DataFrame으로 읽기
- SQL/DataFrame 연산 수행
- 출력 싱크로 지속적으로 쓰기
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 참고 문헌[편집 | 원본 편집]
- https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html
- Spark: The Definitive Guide (O'Reilly)