이번 강은 계속 도착하는 데이터를 다루는 증분 처리 — Structured Streaming과 Auto Loader를 다룬다.
배치는 매번 전체를 다시 읽지만, 증분 처리는 새로 들어온 부분만 처리한다. 메달리온 아키텍처의 Bronze 적재가 대표 사례다.
이 강의 목표는 다음과 같다.
- Structured Streaming의 기본 모델을 이해한다.
- checkpoint가 왜 필요한지 안다.
- Auto Loader로 새 파일을 증분 적재한다.
1. Structured Streaming
스트림을 "끝없이 커지는 테이블"로 다룬다. readStream으로 읽고 writeStream으로 쓴다.
(spark.readStream.table("bronze")
.writeStream
.option("checkpointLocation", ckpt)
.table("silver"))
2. checkpoint와 exactly-once
- checkpoint: 어디까지 처리했는지 위치와 상태를 저장한다.
- 덕분에 재시작해도 중복·누락 없이 정확히 한 번(exactly-once) 이어서 처리한다.
- checkpoint 위치는 스트림마다 고유해야 한다.
3. Trigger 모드
| Trigger | 동작 |
|---|---|
| processingTime='30 seconds' | 30초마다 마이크로배치 |
| availableNow=True | 지금 쌓인 것만 처리하고 종료(배치식) |
| (기본) | 가능한 한 빨리 연속 처리 |
4. Auto Loader
cloudFiles 소스로 스토리지에 새로 도착한 파일만 증분 감지해 읽는다. 파일 목록을 매번 스캔하지 않고 효율적으로 추적한다.
(spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json").load(src)
.writeStream.option("checkpointLocation", ckpt).table("bronze"))
스키마 추론·진화(schema evolution)도 지원해 새 컬럼이 생겨도 대응한다.
예제
예제) S3에 로그 파일이 계속 쌓인다. 이미 처리한 파일은 다시 읽지 않고 새 파일만 Bronze에 넣으려면?
해설) Auto Loader(format("cloudFiles"))로 읽고 checkpointLocation을 지정한다. Auto Loader가 도착한 파일을 추적하므로 이미 처리한 파일은 건너뛰고 새 파일만 증분 적재한다. checkpoint 덕에 재시작해도 이어서 처리한다.
샘플 문제
문) 스트리밍 쿼리에서 checkpointLocation의 역할은?
- (A) 데이터를 압축한다
- (B) 처리 진행 위치·상태를 저장해 재시작 시 정확히 한 번 처리를 보장한다
- (C) 파일을 병합한다
- (D) 스키마를 강제한다
정답: (B). checkpoint는 오프셋·상태를 저장해 장애 후 재시작에도 중복·누락 없이 이어서 처리하게 한다.
정리
- Structured Streaming은 스트림을 무한 테이블로 보고 read/writeStream으로 처리.
- checkpoint가 진행 위치를 저장해 exactly-once와 재시작을 보장.
- Trigger로 마이크로배치·availableNow·연속을 고른다.
- Auto Loader(cloudFiles)는 새 파일만 증분 감지·적재한다.
다음 강에서는 이를 선언형으로 감싸는 Delta Live Tables를 다룬다.
댓글 0
댓글은 운영자만 작성할 수 있어요.