이번 주는 데이터 엔지니어링의 출발점인 "수집(ingestion)"을 배치와 스트리밍으로 나눠 훑었다. 오늘은 흩어진 조각을 하나의 의사결정 지도로 묶는다. DEA-C01 수집 도메인 문제의 9할은 "이 시나리오에 어떤 서비스를 골라야 하나"이고, 그 답은 항상 키워드에서 나온다. 이 종합편의 목표는 시나리오 → 서비스 매핑을 반사적으로 떠올리게 만드는 것이다.
💡 관련 이론: 배치 선택의 두 축은 "데이터양"과 "회선 상황"이다. 회선이 충분하면 온라인(DataSync), 부족하거나 데이터가 너무 크면 오프라인(Snow). 그리고 "내가 끌어오는가(DataSync) vs 외부가 밀어넣는가(Transfer Family)"라는 방향 축이 추가된다. 이 두 축만 잡으면 배치 문제는 거의 다 풀린다.
KDS : 실시간 파이프. 샤드 단위. 멀티 컨슈머·재처리 가능. 컨슈머 코드 직접 작성.
Firehose : 근실시간 적재 파이프. 버퍼링 후 S3/Redshift/OpenSearch에 자동 적재. 코드 거의 없음.
MSK : 관리형 Apache Kafka. 표준 오픈소스·이식성. 기존 Kafka 자산 이전에 최적.
핵심 구분 세 가지를 다시 못 박자.
KDS vs Firehose — 복잡한 실시간 처리·여러 컨슈머·재처리면 KDS, 단순 적재면 Firehose. 둘을 잇는 조합(KDS 소스 → Firehose가 S3 적재)은 "실시간 분석 + 원본 보관" 시나리오의 정답.
로그 모델 공통점 — KDS·Kafka는 모두 append-only 로그라 소비해도 안 사라지고 멀티 컨슈머·재처리가 된다. SQS와 다르다.
# 종합 패턴: KDS(실시간 분석) + Firehose(원본 S3 보관) 동시 운용import boto3firehose = boto3.client("firehose")firehose.create_delivery_stream( DeliveryStreamName="raw-archive", DeliveryStreamType="KinesisStreamAsSource", # 소스를 KDS로 지정 KinesisStreamSourceConfiguration={ "KinesisStreamARN": "arn:aws:kinesis:...:stream/clickstream", "RoleARN": "arn:aws:iam::123456789012:role/firehose-role" }, S3DestinationConfiguration={ "BucketARN": "arn:aws:s3:::my-data-lake", "RoleARN": "arn:aws:iam::123456789012:role/firehose-role", "BufferingHints": {"SizeInMBs": 128, "IntervalInSeconds": 300}, "CompressionFormat": "GZIP" })# 같은 clickstream을 실시간 분석 Lambda가 별도로 소비 → 분석 + 보관 동시 달성
잘 설계된 스트리밍 아키텍처는 "수집 → 처리 → 적재"가 느슨하게 결합된다. KDS/MSK가 수집·버퍼 역할을 하면서 여러 다운스트림(실시간 분석, 데이터 레이크 적재, 검색 인덱싱)을 동시에 먹인다. 이 분리 덕분에 한 컨슈머가 느려져도 다른 컨슈머나 프로듀서가 막히지 않는다. 로그 기반 스트림이 단순 큐보다 데이터 플랫폼에 적합한 이유다.
① 무엇이 들어오나?
├─ 파일·객체 덩어리 ───────────────► 배치 쪽 (②로)
└─ 끊임없이 생기는 작은 레코드 ────► 스트리밍 쪽 (④로)
② 누가 움직이나?
├─ 외부 파트너가 SFTP/FTPS 로 올린다 ► Transfer Family
└─ 우리가 가져온다 (③으로)
③ 회선과 규모는?
├─ 소량·단발 ───────────────────────► S3 업로드(CLI/SDK, 큰 파일은 멀티파트)
├─ 대량·반복, 회선 충분 ────────────► DataSync
└─ 회선 부족 또는 초대용량·일회성 ──► Snow 패밀리
④ 기존 자산이 있나?
├─ Kafka 코드·커넥터·팀 ────────────► MSK (용량 관리도 싫으면 MSK Serverless)
└─ 없음 (⑤로)
⑤ 읽는 쪽 요구는?
├─ 목적지에 쌓기만 하면 된다 ───────► Data Firehose
├─ 여러 앱이 각자 읽는다 / 재처리 ──► Kinesis Data Streams
└─ 둘 다 ───────────────────────────► KDS + Firehose(KDS 를 소스로)
①을 건너뛰고 ⑤부터 보면 틀린다. "매일 밤 파일 서버 동기화" 문제에 Firehose 를 고르는 실수가 여기서 나온다.
④가 ⑤보다 앞이다. "기존 Apache Kafka"가 지문에 있으면 읽는 쪽 요구가 무엇이든 MSK 계열이 먼저다.
⚠️ 함정: 표의 조치 중 "샤드를 늘린다"가 정답인 줄은 생각보다 적다. 쏠림은 키 문제, 읽기 경쟁은 팬아웃 문제, 막힘은 오류 처리 문제다. 용량 증설은 "모든 샤드가 고르게 한도에 닿았을 때"에만 맞는 처방이다.
Week 3는 수집의 나머지 절반 — 스트림 위에서의 실시간 처리와 윈도우, 수집 신뢰성(멱등성·재시도·DLQ), DMS 와 CDC, 이벤트 기반 아키텍처 — 으로 넘어간다. 오늘 만든 "무엇으로 들여오나"의 지도 위에 "들여온 흐름을 어떻게 안전하게 다루나"가 얹힌다. 수집 도메인의 키워드 매핑은 이 지도에서 확인한다.