Stream-Processing-Essential 시리즈의 1단계. 배치가 다루는 '끝이 있는 데이터'와 스트림이 다루는 '끝이 없는 데이터'의 경계를 잡고, Flink가 무한 스트림을 어떤 실행 모델로 표현하는지 — 데이터플로우 그래프(StreamGraph → JobGraph → ExecutionGraph), 연산자 체이닝과 슬롯 공유, 파티션·병렬...
Practical Data Community의 Goutham Budati가 쓴 'Why Technically Excellent Data Teams Still Fail'을 분석한다. 파이프라인·대시보드 실력이 아무리 뛰어나도 데이터 팀이 조직에 영향을 못 주는 이유를 'Data → Perspective → Action' 3층 모델로 설명하고, 해석(Pe...
우아한 객체·링크 모델도 실제 데이터와 이어지지 않으면 그림일 뿐입니다. 파이프라인 산출물인 백킹 데이터셋을 객체 타입의 물리적 뒷받침으로 삼는 속성 매핑, 여러 소스에 흩어진 같은 실체를 하나의 객체로 묶는 엔티티 해소(결정적·확률적 매칭, 매칭 신뢰도, 골든 레코드), 그리고 중복·불일치·누락이라는 지저분한 현실 위에서 신뢰할 만한 객체 그래프를 ...
Pivotal(Abraham Thomas)의 'On Data Quality (1): Basics'를 분석한다. 데이터 품질은 내재된 속성이 아니라 유스케이스에 따라 창발하는 현상이며, 세분·집합·목적적합·비즈니스가치라는 4단 사다리로 이해해야 한다는 프레임워크를 정리하고 실무적 함의를 짚는다.
Spark-Essential 시리즈의 완결편(심화). 앞 단계에서 갈고닦은 Spark를 2026 레이크하우스 스택에 얹습니다. Iceberg·Delta 오픈 테이블 포맷이 오브젝트 스토리지의 파일 더미 위에 메타데이터·스냅샷으로 ACID·시간여행을 세우는 원리를 Spark 관점에서 짚고, 카탈로그 설정·MERGE/업서트·스키마·파티션 진화로 읽고 쓰며...
현실의 Spark 코드 대부분을 차지하는 PySpark를 파고듭니다. Python↔JVM 경계(Py4J)와 왜 대부분 내장 함수로 충분한지, UDF의 종류(느린 Python UDF vs Arrow 기반 벡터화 Pandas UDF)와 직렬화 비용, 내장 함수 우선 원칙, 그리고 기존 pandas 코드를 최소 수정으로 분산 실행하는 pandas API o...
무한 스트림을 계속 자라는 테이블로 보는 Spark Structured Streaming을 파고듭니다. 배치와 통합된 DataFrame API와 마이크로배치 모델, 이벤트 시간 집계에서 언제 윈도를 닫고 지각 데이터를 버릴지 정하는 워터마크와 윈도잉, 그리고 상태 관리·체크포인트·출력 모드로 exactly-once를 보장하는 방식까지 다룹니다.
Spark에서 가장 비싼 연산인 셔플을 줄이고 다스리는 성능 튜닝을 파고듭니다. 파티션 수·repartition/coalesce·파티션 프루닝, 한 키 쏠림이 부르는 데이터 스큐(salting·AQE skew join)와 메모리를 넘겨 디스크로 흘리는 스필(spill) 진단, 그리고 broadcast·sort-merge·shuffle-hash 조인 전...
DataFrame이 RDD보다 빠른 이유를 파고듭니다. Catalyst가 쿼리를 논리 계획 → 분석 → 최적화된 논리 계획 → 물리 계획으로 변환하며 조건 푸시다운·컬럼 프루닝을 적용하는 과정, Tungsten의 off-heap 바이너리 메모리 관리와 whole-stage code generation, 그리고 런타임 통계로 계획을 다시 짜는 AQE까지...
Spark가 데이터를 다루는 세 얼굴 — 계보 기반 내결함성의 저수준 RDD, 스키마로 Catalyst 옵티마이저가 개입하는 DataFrame, 타입 안전을 더한 Dataset — 의 차이와 선택 기준을 정리합니다. 나아가 변환은 계획만 쌓고 액션에서 실행하는 lazy evaluation과, 노드 안에서 끝나는 narrow와 셔플을 부르는 wide 트...
Spark-Essential 시리즈의 1단계. 실행 계획을 세우는 Driver와 task를 수행하는 Executor의 역할·통신, 자원을 배분하는 클러스터 매니저(YARN·Kubernetes·Standalone)와 client/cluster 배포 모델, 그리고 액션→Job→Stage→Task 분해에서 스테이지 경계가 곧 셔플 지점이 되는 실행 흐름을 ...
Lakehouse-Essential의 마지막 7단계. 앞선 여섯 단계에서 익힌 축(메타데이터 구조·트랜잭션·진화·유지보수·카탈로그)으로 Iceberg·Delta Lake·Hudi·Paimon을 나란히 비교합니다. _delta_log 로그 리플레이, Hudi timeline과 COW/MOR, Paimon의 LSM·changelog까지 각 포맷의 내부를 ...
Iceberg 테이블의 '현재'를 쥐고 있는 카탈로그를 파고듭니다. 테이블 이름을 metadata.json 포인터로 매핑하고 커밋의 원자적 CAS를 실제로 수행하는 카탈로그의 역할, Hive·Hadoop·JDBC·Glue·Nessie로 파편화됐던 구현을 HTTP API 스펙 하나로 표준화한 REST Catalog와 그 커밋 프로토콜, 그리고 RBAC·...
돌아가는 Iceberg 테이블과 건강한 Iceberg 테이블을 가르는 운영 지식을 다룹니다. 스트리밍 쓰기가 양산하는 작은 파일을 rewrite_data_files(bin-pack·sort·z-order)로 합치고, 커밋마다 쌓이는 스냅샷을 expire_snapshots로 만료시켜 파일 삭제로 잇고, 고아 파일 정리와 매니페스트 리라이트까지 포함한 정...
Iceberg가 Hive 테이블과 결정적으로 갈라지는 지점 — 재작성 없는 진화를 파고듭니다. 컬럼을 이름이 아닌 고유 ID로 추적해 add/drop/rename/reorder/타입 승격을 안전하게 만드는 스키마 진화, 파티션을 물리 경로가 아닌 컬럼에서 유도되는 메타데이터로 만드는 숨은 파티셔닝(transform), 그리고 월→일 같은 파티션 스펙 ...
Iceberg의 커밋은 새 metadata.json을 쓰고 카탈로그의 포인터를 compare-and-swap으로 교체하는 한 동작입니다. 파일은 불변이고 포인터만 상태이기에 이 교체 하나가 원자성의 전부이며, 그 위에서 스냅샷 격리·시간여행(VERSION AS OF)·롤백·optimistic concurrency의 충돌 감지와 재시도가 성립하는 원리를...
Iceberg의 모든 능력이 나오는 뿌리를 해부합니다. 카탈로그가 가리키는 메타데이터 파일(vN.metadata.json)에서 매니페스트 리스트(snap-*.avro), 매니페스트(*.avro), 데이터 파일로 이어지는 계층 구조와, 커밋이 새 스냅샷을 만들며 매니페스트를 재사용하는 방식, 그리고 파티션 요약과 컬럼 min/max 통계가 파일 list...
오브젝트 스토리지에 Parquet를 쌓는 것만으로는 테이블이 되지 않습니다. 디렉터리와 파일 목록에 의존하는 Hive 테이블 모델이 원자성·일관성·성능에서 무너지는 지점을 구체적인 실패 시나리오로 짚고, 파일 집합 위에 스냅샷·스키마·통계라는 메타데이터 계층을 얹어 '테이블'을 만드는 오픈 테이블 포맷의 발상, 그리고 그것이 레이크하우스를 성립시키는 ...
Kafka-Essential 시리즈의 완결편. 별도 클러스터 없이 라이브러리만으로 토픽을 변환·집계·조인하는 Kafka Streams를 파고듭니다. KStream/KTable 이원성과 토폴로지, RocksDB state store와 changelog 토픽의 내결함성, 이벤트 시간 윈도잉과 exactly_once_v2, 그리고 언제 Flink 같은 전용...
여러 팀이 오래 공유하는 로그에서 데이터의 형태는 곧 시스템 간 계약입니다. 스키마를 중앙에 등록하고 메시지에는 매직 바이트 + 스키마 ID만 실어 보내는 Schema Registry의 wire format과 serializer 흐름, Avro/Protobuf/JSON Schema 비교와 reader/writer 스키마 해석, 그리고 BACKWARD/...
프로듀서·컨슈머를 매번 직접 짜는 대신, 선언적 설정만으로 외부 시스템과 Kafka를 잇는 Kafka Connect를 파고듭니다. worker·connector·task의 분산 실행 모델, Debezium이 PostgreSQL WAL·MySQL binlog를 읽어 변경 이벤트로 바꾸는 로그 기반 CDC의 원리, 그리고 replication slot 방...
Kafka에서 가장 자주 오해되는 주제, 전달 보장을 파고듭니다. '유실 없음'과 '중복 없음'을 분리해 at-most-once·at-least-once·exactly-once 세 전달 의미를 실패 시나리오로 해부하고, 멱등 프로듀서(PID·시퀀스 번호)가 재시도 중복을 걸러내는 원리와 그 한계, 그리고 트랜잭션(transactional.id·send...
Kafka의 읽기·쓰기 경로를 파고듭니다. 프로듀서의 send 경로(serializer → partitioner → 배치 → Sender)와 acks로 조율하는 처리량 vs 내구성, pull 기반 컨슈머의 poll 루프와 오프셋 커밋(자동 vs 수동), 그리고 컨슈머 그룹의 파티션 분배와 리밸런싱 — eager vs cooperative, static...
Kafka의 1층인 분산 커밋 로그를 파고듭니다. 큐가 아니라 append-only 로그라는 관점에서 세그먼트 파일·순차 I/O·zero-copy·retention과 compaction·재생(replay)의 힘을 잡고, 토픽·파티션·오프셋이 병렬성과 순서를 어떻게 가르는지, 파티셔닝 키와 핫 파티션·파티션 수 결정의 트레이드오프, 그리고 리더/팔로워 ...
dbt-Essential 시리즈의 마지막 6단계 — 대시보드마다 다르게 계산되는 '매출'의 지표 파편화 문제를, MetricFlow의 semantic model·metric 선언과 조회 시점 SQL 생성으로 해결하고, BI·노트북·API가 하나의 정의를 소비하는 지표 표준화까지 완성합니다.
dbt를 팀의 것으로 만드는 5단계 — packages.yml과 dbt hub 패키지·사내 공통 모듈 전략, manifest 기반 state:modified와 --defer로 바뀐 모델만 검증하는 Slim CI, 그리고 GitHub Actions 배포 파이프라인과 오케스트레이터 연동까지 팀 규모 배포의 전부를 다룹니다.
매번 전체를 다시 만드는 대신 바뀐 행만 병합하는 incremental 모델의 동작 원리(is_incremental() 분기, unique_key, 전략별 차이)와, 원천이 덮어쓰는 값의 변화 이력을 SCD Type 2로 보존하는 snapshot을 재실행 안전성의 관점으로 꿰어냅니다.
dbt SQL이 사실은 Jinja 템플릿이라는 것 — 컴파일 시점에 변수·if·for가 순수 SQL로 펼쳐지는 실행 모델부터, 반복 로직을 함수처럼 묶는 매크로, run_query로 SQL을 생성하는 SQL, adapter.dispatch, 그리고 dbt_utils·codegen 같은 매크로 패키지와 과도한 매크로화의 경계까지 다룹니다.
내장 제네릭 테스트 4종이 컴파일되는 SQL부터 커스텀 테스트·severity 설정, docs 블록과 데이터 카탈로그, ref가 만든 lineage 그래프와 exposure까지 — '이 숫자를 믿어도 되는가'에 코드로 답하는 dbt의 테스트·문서화 체계를 해부합니다.
dbt의 심장인 모델·ref·source를 파고듭니다. SELECT 하나가 뷰·테이블로 구체화되는 materialization 전략, ref()가 하드코딩된 테이블명 대신 의존성 그래프를 세우는 원리, source() 선언과 freshness 검사, 그리고 staging → intermediate → marts 계층형 모델링까지 jaffle-shop ...
Airflow를 프로덕션에 올리는 마지막 단계 — 스케줄러·웹서버·triggerer·메타데이터 DB의 배포 구성과 KubernetesExecutor의 task-per-pod 실행, 원격 로깅·메트릭·SLA 경보, 그리고 Secrets 관리·스케줄러 HA·장애 대응까지 운영 견고성의 전부를 다룹니다.
Airflow의 시간 모델인 논리적 실행 구간(data interval)을 뿌리부터 이해하고, catchup·backfill로 과거 구간을 다시 채우는 법과 그 재실행이 데이터를 오염시키지 않도록 태스크를 멱등하게 설계하는 패턴(파티션 덮어쓰기·업서트·결정적 경로)을 하나의 설계 원칙으로 꿰어냅니다.
파일 도착·외부 잡 종료 같은 외부 상태를 기다리는 센서의 poke/reschedule 모드부터, 대기를 triggerer의 비동기 이벤트 루프로 넘겨 워커 슬롯을 해방하는 deferrable 오퍼레이터까지 — '기다림'을 자원 낭비 없이 설계하는 법을 다룹니다.
격리된 프로세스에서 도는 Airflow 태스크 사이로 데이터를 넘기는 XCom의 push/pull 메커니즘과 크기 한계, @task 데코레이터로 XCom을 암묵화하는 TaskFlow API, 그리고 큰 데이터는 외부 스토리지에 쓰고 참조만 넘기는 패턴과 custom XCom backend까지 다룹니다.
DAG processor의 파싱·직렬화부터 스케줄러의 스케줄링 루프, Local·Celery·Kubernetes Executor의 아키텍처와 선택 기준, 그리고 task 상태 전이·재시도·zombie까지 — 'DAG가 안 돈다'를 구조적으로 진단할 수 있는 Airflow 실행 내부를 해부합니다.
Airflow의 출발점인 DAG·오퍼레이터·태스크를 파고듭니다. 파이프라인을 방향성 비순환 그래프로 모델링하는 이유, 오퍼레이터(템플릿)와 태스크(인스턴스)의 관계와 의존성 정의, 그리고 파이프라인을 파이썬 코드로 선언하는 configuration as code 철학과 동적 DAG 생성까지 다룹니다.
Data-Engineering-Essential 오버뷰의 '오케스트레이션' 단계에서 예고된 Apache Airflow 심화 스핀오프. DAG·오퍼레이터·태스크부터 스케줄러/Executor 내부, XCom·TaskFlow, 센서·deferrable, 백필·catchup·멱등, K8s 배포·운영까지 6단계로 정복하는 학습 로드맵입니다. 도장깨기 방식으로 ...
Data-Engineering-Essential 오버뷰의 '처리' 단계에서 예고된 dbt(변환·애널리틱스 엔지니어링) 심화 스핀오프. 모델·ref·소스부터 테스트·문서화, 매크로·Jinja, incremental·snapshot, 패키지·CI, 세만틱 레이어까지 6단계로 정복하는 학습 로드맵입니다. 도장깨기 방식으로 진행 상황을 추적합니다.
Data-Engineering-Essential 오버뷰의 '수집' 단계에서 예고된 Apache Kafka 심화 스핀오프. 분산 로그·토픽·파티션부터 프로듀서/컨슈머, 전달 보장(exactly-once), Kafka Connect(CDC), Schema Registry, Kafka Streams까지 6단계로 정복하는 학습 로드맵입니다. 도장깨기 방식으로...
Data-Engineering-Essential 오버뷰의 '저장' 단계에서 개념만 소개한 오픈 테이블 포맷을 Apache Iceberg 중심으로 파고드는 심화 스핀오프. 문제의식부터 메타데이터·매니페스트 구조, ACID·스냅샷·시간여행, 파티션/스키마 진화, compaction·유지보수, REST Catalog·거버넌스, 그리고 Iceberg vs D...
Data-Engineering-Essential 오버뷰의 '처리' 단계에서 예고된 Apache Spark 심화 스핀오프. 아키텍처(Driver/Executor)부터 RDD/DataFrame/Dataset, Catalyst·Tungsten, 셔플·튜닝, Structured Streaming, PySpark 실무, Iceberg/Delta 연동까지 7단계...
Data-Engineering-Essential 오버뷰의 '처리' 단계에서 개념만 소개한 이벤트 시간·워터마크·윈도잉을 Apache Flink 중심으로 파고드는 심화 스핀오프. 스트림 처리 모델부터 이벤트 시간·워터마크, 상태·체크포인트, exactly-once, 윈도잉·조인·CEP, Flink SQL까지 6단계로 정복하는 학습 로드맵입니다. 도장깨기...
데이터 파이프라인에 버전 관리·자동 테스트·환경 분리·자동 배포(DataOps/CI-CD)를 입히고, SLA/SLO/SLI와 경보·장애 대응·FinOps로 신뢰성을 지키며, 최소 권한·마스킹·암호화·규정 준수로 데이터를 안전하게 운영하는 법을 다룹니다. 시리즈의 마지막 10단계.
품질 차원과 검증(Great Expectations·dbt tests·데이터 계약), 리니지·카탈로그(DataHub·OpenMetadata), 그리고 관측가능성의 5축(신선도·볼륨·스키마·분포·리니지)을 통해 '파이프라인이 돈다 ≠ 데이터가 맞다'는 간극을 어떻게 메우는지 다룹니다.
실시간 분석·로그/이벤트·ML 피처·CDC 리포팅이라는 네 가지 대표 시나리오를 요구사항(지연·정확성·규모) → 설계(수집·저장·처리·오케스트레이션 선택) → 트레이드오프의 순서로 풀어, 앞 단계에서 배운 개념을 실제 파이프라인 설계로 연결합니다.
Lambda·Kappa의 배치/스트림 경로 설계부터 Bronze→Silver→Gold로 품질을 끌어올리는 Medallion, 그리고 Modern Data Stack과 도메인 중심의 Data Mesh까지 — 데이터 시스템을 떠받치는 대표 아키텍처 패턴을 그 트레이드오프와 함께 정리합니다.
수많은 데이터 작업을 DAG로 모델링하고 의존성·스케줄에 따라 실행하는 오케스트레이션의 원리, Airflow와 Dagster·Prefect의 철학 차이, 그리고 멱등성·재시도·백필·체크포인트로 견고한 파이프라인을 만드는 법을 다룹니다.
MapReduce에서 인메모리·DAG 실행의 Spark로 이어진 분산 처리 모델, 이벤트 시간·워터마크·윈도잉으로 무한 스트림을 다루는 Flink/Kafka Streams, 그리고 SQL 변환을 소프트웨어처럼 관리하는 dbt까지 — 저장된 데이터를 가치로 바꾸는 처리 엔진을 정리합니다.
OLTP와 OLAP, 행 지향과 열 지향 저장의 차이부터 데이터 웨어하우스·레이크·레이크하우스의 선택 기준, Parquet/ORC/Avro 같은 파일 포맷과 Iceberg/Delta/Hudi 같은 테이블 포맷까지 — 데이터를 '어디에 어떤 형태로' 쌓을지를 한 층씩 풀어냅니다.
원천에서 데이터를 가져오는 수집 단계 — 배치 vs 스트리밍의 트레이드오프, 로그 기반 vs 쿼리 기반 CDC, Kafka·Kinesis 같은 스트리밍 플랫폼의 버퍼·디커플링 역할, 그리고 Airbyte·Fivetran 같은 수집 도구의 build vs buy 판단까지 다룹니다.
데이터 웨어하우스에서 Hadoop·데이터 레이크, ETL에서 ELT로의 전환, 그리고 Modern Data Stack과 레이크하우스·스트리밍까지 — 데이터 파이프라인이 각 시대의 한계를 어떻게 풀어 왔는지 그 진화의 맥락을 짚습니다.
데이터 엔지니어링의 정의와 데이터 엔지니어의 역할, 그리고 모든 데이터 작업을 꿰뚫는 데이터 엔지니어링 수명주기(생성→수집→저장→변환→서빙)와 저류(Undercurrents)를 깊이 있게 다룹니다.
데이터 엔지니어링의 정의와 역사부터 수집·저장·처리·오케스트레이션 기술 오버뷰, 사례별 파이프라인 설계, 품질·거버넌스·DataOps까지 10단계로 정복하는 종합 학습 로드맵입니다. 도장깨기 방식으로 진행 상황을 추적합니다.