Structured Streaming

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.03
조회수
8
버전
v1

Structured Streaming

개요

Structured Streaming은 아치 스파크(Apache Spark) 2.0 버전부터 도입된 고수준 스트리밍 처리 엔진으로, 실시간 데이터 스트림을 마치 정적 데이터를 다루는 것처럼 선언형 방식으로 처리할 수 있도록 설계되었습니다. 기존의 스파크 스트리밍(Spark Streaming)이 마이크로배치(Micro-batch) 기반의 DStream을 사용했다면, Structured Streaming은 데이터를 지속적인 테이블(continuous table)로 추상화하여 SQL 또는 DataFrame/Dataset API를 통해 스트리밍 데이터를 처리합니다.

이 방식은 개발자에게 친숙한 배치 처리와 유사한 인터페이스를 제공함으로써 실시간 데이터 처리의 복잡성을 크게 줄이며, 정확한 오류 처리, 최소한의 지연 시간, 그리고 배치와 스트리밍 간의 코드 통합을 가능하게 합니다.


주요 특징

1. 선언형 API

Structured Streaming은 DataFrame 및 Dataset API를 기반으로 하며, 사용자는 SQL 쿼리나 함수형 프로그래밍 방식으로 스트림을 정의할 수 있습니다. 이는 기존 배치 처리 코드와 거의 동일한 형태로 작성할 수 있어 유지보수와 재사용이 용이합니다.

예시:

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

val wordCounts = lines.as[String].flatMap(_.split(" ")).groupBy("value").count()

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

2. 지속적인 테이블 추상화 (Continuous Table Abstraction)

Structured Streaming은 입력 스트림을 입력 테이블(Input Table)로 간주합니다. 새로운 데이터가 도착하면 이 테이블에 행이 추가되는 것으로 모델링됩니다. 사용자는 이 테이블에 대해 변환 연산을 수행하고, 결과를 출력 모드에 따라 갱신합니다.

  • Append Mode: 새로운 행만 출력 (기본값, 변경되지 않은 데이터는 생략)
  • Update Mode: 상태가 변경된 행만 출력
  • Complete Mode: 전체 결과 테이블을 매번 출력

3. 정확한 일회성 처리 (Exactly-once Semantics)

Structured Streaming은 체크포인트(checkpointing)와 월터마크(watermark) 기능을 통해 실패 시 데이터 손실 없이 정확한 일회성 처리를 보장합니다. 이를 통해 중복 처리나 데이터 누락 없이 신뢰성 높은 실시간 처리가 가능합니다.


아키텍처 및 동작 원리

Structured Streaming은 Catalyst 쿼리 최적화 엔진과 Tungsten 실행 엔진을 활용하여 고성능 실시간 처리를 구현합니다. 내부적으로는 다음과 같은 구성 요소로 작동합니다:

  1. 소스(Source): Kafka, 파일 시스템, 소켓 등에서 데이터를 수신
  2. 쿼리 계획(Query Plan): Catalyst를 통해 최적화된 실행 계획 생성
  3. 실행 엔진(Execution Engine): Tungsten 기반으로 데이터 처리
  4. 싱크(Sink): 처리 결과를 콘솔, 파일, 데이터베이스 등으로 출력
  5. 체크포인트 디렉터리: 실패 복구를 위한 메타데이터 저장

또한, 트리거(trigger) 설정을 통해 배치 주기(예: 1초마다)를 조정하거나, 연속 모드(Continuous Processing Mode)를 사용하여 최대 1ms 이하의 지연을 달성할 수 있습니다.


주요 사용 사례


고급 기능

워터마크 (Watermarking)

스트림 간의 조인이나 윈도우 연산 시, 지연된 이벤트(Late data)를 처리하기 위한 기법입니다. 특정 시간 기준을 설정하여 그 이전의 데이터는 무시함으로써 상태 관리의 효율성을 높입니다.

val windowedCounts = words
  .withWatermark("timestamp", "10 minutes")
  .groupBy(
    window($"timestamp", "10 minutes", "5 minutes"),
    $"word"
  )
  .count()

상태 관리

장시간 실행되는 스트림 애플리케이션의 경우, 상태 정보(예: 세션 정보, 집계값)를 지속적으로 관리해야 합니다. Structured Streaming은 RocksDB와 같은 외부 저장소를 활용해 대규모 상태를 효율적으로 저장하고 복구할 수 있습니다.


참고 자료


관련 문서

Structured Streaming은 실시간 데이터 처리의 패러다임을 바꾼 중요한 기술로, 데이터 엔지니어와 분석가들이 배치와 스트리밍을 통합된 방식으로 다룰 수 있게 해줍니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?