이번 강은 상태(state)를 다루는 고급 스트리밍을 다룬다.
집계·조인 같은 연산은 과거 데이터를 기억해야 한다. 이 상태를 어떻게 관리하고, 늦게 도착하는 데이터를 어떻게 처리하는지가 핵심이다.
이 강의 목표는 다음과 같다.
- 이벤트 시간과 워터마크의 개념을 안다.
- 윈도우 집계와 상태 관리를 이해한다.
- 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
댓글은 운영자만 작성할 수 있어요.