수집 파이프라인 구축
사용 시기
- 데이터베이스, API, 파일 또는 SaaS에서 웨어하우스/레이크로 추출할 때
- 증분 추출, 워터마크 또는 CDC를 설계할 때
- API 페이지네이션, 속도 제한 및 재시도를 처리할 때
- 관리형 EL(Fivetran/Airbyte)과 사용자 정의 코드 중 결정할 때
- 이미 적재된 데이터를 변환하는 데는 사용하지 마십시오(dbt/Spark 스킬 사용).
워크플로우
- [ ] 추출 모드 결정: 전체 스냅샷 vs 증분 vs CDC
- [ ] 신뢰할 수 있는 하이워터마크 선택(updated_at, LSN/binlog, 시퀀스)
- [ ] 원시 데이터를 불변적으로 적재(추가), 이후 다운스트림에서 변환
- [ ] 로드를 멱등적으로 만듦(upsert/키별 파티션 덮어쓰기)
- [ ] 페이지네이션, 속도 제한, 재시도 및 지연 데이터 처리
- 모드를 선택하세요. 전체 재로드(소형/차원 테이블), 하이워터마크 기반 증분(대부분의 팩트 테이블), 또는 CDC(삭제와 모든 변경이 필요한 대용량 OLTP) 중 선택합니다.
- 신뢰할 수 있는 워터마크를 선택하세요.
updated_at은 소스가 항상 업데이트할 때만 작동합니다. 그렇지 않으면 DB 로그 위치(LSN/binlog/SCN) 또는 단조 시퀀스를 사용하세요. 마지막 워터마크를 저장하고 그 지점부터 재개합니다. - 원시 데이터를 불변적으로 적재하세요. 원시 추출물을 로드 메타데이터와 함께 추가(브론즈 레이어)합니다. 변환은 다운스트림에서 수행하여 소스를 다시 가져오지 않고도 재생할 수 있게 합니다.
- 멱등적 로드. 자연 키로 upsert하거나 파티션을 덮어써서 재시도와 중복이 중복을 발생시키지 않도록 합니다(
writing-idempotent-transformations참조). - 견고하게 만드세요. 페이지네이션, 속도 제한 및 지연 데이터에 대비합니다.
패턴
지연 데이터를 위한 중복 윈도우를 포함한 증분 추출:
-- 마지막 워터마크 이후 작은 중복 윈도우를 가져와 지연 업데이트를 포착하고,
-- 키로 upsert하여 중복이 생기지 않도록 합니다.
SELECT * FROM source.orders
WHERE updated_at >= :last_watermark - INTERVAL '3 days';
CDC — 데이터베이스 로그(Debezium/네이티브)를 읽어 삽입, 업데이트 및 삭제(워터마크 기반 추출이 놓치는 부분)를 포착합니다. 변경의 커밋 위치를 순서 기준으로 사용하여 MERGE로 변경 사항을 적용합니다.
API 페이지네이션 + 속도 제한 — 커서/다음 페이지 토큰을 따르고, 429/5xx 오류 시 지수 백오프와 지터를 사용하여 백오프 및 재시도하며, 진행 상황을 체크포인트하여 실패 시 중간부터 재개합니다.
관리형 대 사용자 정의 — 표준 커넥터에는 Fivetran/Airbyte를 사용합니다(스키마 변경, 증분 상태, 재시도를 처리합니다). 비표준 소스 또는 엄격한 제어/비용 요구 사항이 있을 때만 사용자 정의 코드를 작성합니다.
일반적인 함정
- 소스가 안정적으로 설정하지 않는
updated_at워터마크 — 조용히 행을 누락합니다. 검증하거나 로그 기반 CDC로 전환하세요. - 중복 윈도우 없음 — 실행 사이에 지연 도착 업데이트가 손실됩니다.
- 삭제를 기대하는 워터마크 기반 추출 — 삭제를 볼 수 없습니다. CDC 또는 주기적인 전체 조정을 사용하세요.
- 추출 중 변환 수행 — 재생이 불가능합니다. 먼저 원시 데이터를 적재하세요.
- 속도 제한/페이지네이션 경계 사례 무시 — 완료된 것처럼 보이는 부분 추출이 발생합니다. 체크포인트를 만들고 카운트를 검증하세요.
- 비멱등적 로드 — 재시도와 중복 윈도우가 행을 중복시킵니다.