Databricks 데이터 엔지니어

Databricks 데이터 엔지니어 10강

[Professional] 고급 스트리밍 — 상태·워터마크·윈도우

이번 강은 상태(state)를 다루는 고급 스트리밍을 다룬다.

Databricks 10강 개념도

집계·조인 같은 연산은 과거 데이터를 기억해야 한다. 이 상태를 어떻게 관리하고, 늦게 도착하는 데이터를 어떻게 처리하는지가 핵심이다.

이 강의 목표는 다음과 같다.

  • 이벤트 시간과 워터마크의 개념을 안다.
  • 윈도우 집계와 상태 관리를 이해한다.
  • foreachBatch로 스트림에 배치 로직을 결합한다.

1. 이벤트 시간과 지연

  • 이벤트 시간(event time): 데이터가 실제 발생한 시각. 처리 시각과 다르다.
  • 네트워크 지연으로 데이터는 순서 없이, 늦게 도착할 수 있다.

2. 워터마크 (Watermark)

워터마크는 "이 시각보다 더 늦은 데이터는 버린다"는 경계다.

(df.withWatermark("event_time", "10 minutes")
   .groupBy(window("event_time", "5 minutes"))
   .count())
  • 워터마크가 없으면 상태가 무한히 커진다.
  • 워터마크 이후 도착한 지연 데이터는 버려지고, 관련 상태도 정리된다.

3. 윈도우 집계

시간 구간(윈도우)별로 집계한다. 텀블링(겹치지 않음)·슬라이딩(겹침) 윈도우가 있다.

4. 상태 기반 연산과 foreachBatch

  • stream-stream 조인, 중복 제거(dropDuplicates), 집계는 상태를 저장한다.
  • foreachBatch: 각 마이크로배치를 DataFrame으로 받아 배치 API(MERGE 등)를 적용한다. 스트리밍에서 upsert를 구현하는 표준 방법이다.
def upsert(batch_df, batch_id):
    batch_df.createOrReplaceTempView("u")
    batch_df.sparkSession.sql("MERGE INTO tgt USING u ON ...")
stream.writeStream.foreachBatch(upsert).start()

예제

예제) 5분 윈도우로 이벤트를 집계하는데, 일부 데이터가 20분 늦게 도착해 상태가 계속 쌓인다. 어떻게 제한하나?

해설) withWatermark로 지연 허용치(예: 10분)를 설정한다. 그러면 워터마크를 넘어 늦게 온 데이터는 버려지고, 이미 확정된 윈도우의 상태는 정리되어 메모리가 무한히 커지지 않는다. 허용치는 지연 특성과 정확도 요구의 균형으로 정한다.

샘플 문제

문) 스트리밍 집계에서 워터마크의 주된 목적은?

  • (A) 데이터 암호화
  • (B) 상태 크기를 제한하고 지연 데이터 처리 기준을 정함
  • (C) 파일 병합
  • (D) 스키마 강제

정답: (B). 워터마크는 늦은 데이터의 허용 경계를 정해 오래된 상태를 정리하고, 상태가 무한히 커지는 것을 막는다.

정리

  • 이벤트 시간 기준 처리에서 지연·비순서 도착이 문제가 된다.
  • 워터마크로 지연 허용 경계를 정해 상태를 제한한다.
  • 윈도우로 시간 구간별 집계를 한다(텀블링·슬라이딩).
  • foreachBatch로 스트림에 MERGE 같은 배치 로직을 결합한다.

다음 강에서는 MERGE·CDF로 증분 처리를 심화한다.

댓글 0