
Databricks나 Spark 기반 데이터 파이프라인을 구축하다 보면 가장 많이 듣는 개념 중 하나가 바로 checkpoint(체크포인트) 입니다. 특히 Structured Streaming이나 Auto Loader를 사용할 때는 “체크포인트가 꼭 필요하나요?”라는 질문을 많이 받습니다.
결론부터 말하자면:
✔ 대부분의 스트리밍 파이프라인에서는 체크포인트가 필수
✔ Auto Loader는 체크포인트 없이는 사실상 운영 불가
이번 글에서는 체크포인트가 정확히 어떤 역할을 하는지, 어떤 경우에 꼭 필요하고 어떤 경우에는 생략할 수 있는지를 쉬운 언어로 정리해보겠습니다.
✔ Structured Streaming에서 체크포인트의 역할 3가지
Structured Streaming이 안정적으로 동작하기 위해서는 다음 3가지가 반드시 필요합니다.
1) ✔ 오프셋(Offset) 저장
스트리밍 소스(Kafka, Event Hub, 파일 등)에서 “어디까지 읽었는지” 를 기억해야 합니다.
체크포인트가 없으면:
- 스트리밍 재시작 시 처음부터 다시 읽음
- 중복 데이터 처리 발생
- Exactly-once 보장 불가
체크포인트가 있으면:
- 마지막 오프셋을 기록
- 재시작 시 그 지점부터 이어서 처리
즉, 중복 처리와 데이터 누락을 막는 핵심 기능 입니다.
2) ✔ Stateful 연산 상태(State) 저장
다음과 같은 연산은 내부에 상태를 유지합니다.
- Window / watermark
- dropDuplicates
- groupBy + agg
- mapGroupsWithState
이 상태를 저장하는 곳이 바로 checkpoint 위치입니다.
체크포인트가 없다면:
- 스트리밍이 재시작될 때 state가 사라짐
- 집계된 결과가 초기화
- 정확한 결과 보장 불가
즉, Stateful 연산을 한다면 체크포인트는 완전 필수입니다.
3) ✔ 커밋 로그(Commit Log) 저장
Structured Streaming의 writeStream은 각 마이크로 배치가 성공적으로 완료되었는지 기록합니다.
이를 checkpoint에서 관리함으로써:
- 이미 성공적으로 쓴 배치는 재처리하지 않음
- 장애 발생 후 다시 시작해도 안전하게 재처리 가능
- Delta Lake와의 exactly-once 쓰기 보장과도 연결됨
즉, 일관성과 장애 복구를 책임지는 핵심 메커니즘입니다.
✔ 체크포인트가 없어도 되는 경우
체크포인트는 필수인 경우가 많지만, 아래와 같은 상황이라면 생략 가능하기도 합니다.
✔ console sink, memory sink를 사용하는 테스트
df.writeStream.format("console").start()
테스트나 실험 단계에서는 체크포인트 없이 실행할 수 있습니다. 하지만 재시작 시 모든 상태는 사라지고, 중복 처리는 방지되지 않습니다.
✔ “정확성 필요 없음 + 임시 테스트”
개발자가 “그냥 출력만 확인”할 때 사용되는 패턴입니다.
⚠ 단, 운영 환경에서는 절대 비추천!
✔ Auto Loader에서는 왜 체크포인트가 필수인가?
Auto Loader는 파일을 “증분 방식”으로 처리하는 기능입니다.
즉,
- 어떤 파일이 이미 처리되었는지
- 어떤 파일이 새로 들어왔는지
- 스키마가 어떻게 변했는지
이 모든 상태를 저장해야 합니다. Auto Loader는 내부적으로 2개의 저장 위치를 반드시 필요로 합니다.
| 옵션 | 역할 |
| cloudFiles.schemaLocation | 스키마 추적, 스키마 진화 기록 |
| checkpointLocation | 처리된 파일 목록, 오프셋, 실행 상태 저장 |
만약 checkpoint가 없다면:
- 매번 전체 디렉토리를 재귀적으로 스캔
- 처리했던 파일도 다시 읽음
- 엄청난 비용 폭발
- 장애 후 정확한 재처리 불가능
즉, Auto Loader는 checkpoint 없이는 진짜 의미 있는 ingestion 기능을 사용할 수 없다.
✔ 언제 반드시 필요한가?
정확하게 정리하면:
| 상황 | checkpoint 필요 여부 |
| Kafka, Event Hub, Files 등 스트리밍 | ✔ 필수 |
| Stateful 연산 | ✔ 필수 |
| Auto Loader | ✔ 필수 |
| 운영 환경 | ✔ 필수 |
| 테스터블 console/memory sink | ❌ 옵션 |
| 중복 처리/장애 복구 필요 없음 | ❌ 가능하지만 비추천 |
✔ 마무리
Structured Streaming과 Auto Loader에서 체크포인트는 단순 옵션이 아니라 데이터 일관성, 장애복구, 증분 처리를 모두 담당하는 핵심 요소입니다. 특히 Auto Loader는 체크포인트와 스키마 저장 위치 없이는 “증분 처리”라는 기능 자체가 불가능합니다. 운영 환경에서 스트리밍 파이프라인을 구축할 때는 반드시 checkpoint를 설정해야 하며, 경로 관리와 파티션 구조 또한 신중하게 설계해야 합니다.
'빅데이터 > Spark' 카테고리의 다른 글
| [Deep Dive] Spark Internals: spark-submit부터 Task 실행까지의 여정 (1) | 2026.01.08 |
|---|---|
| Spark Structured Streaming: Stream-Static Join 완벽 정리 (허용되는 조인 vs 허용되지 않는 조인) (0) | 2025.11.18 |
| 왜 모두가 Spark를 쓰는가? 분산 데이터 처리의 정석 (7) | 2025.07.30 |