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의 1층인 분산 커밋 로그를 파고듭니다. 큐가 아니라 append-only 로그라는 관점에서 세그먼트 파일·순차 I/O·zero-copy·retention과 compaction·재생(replay)의 힘을 잡고, 토픽·파티션·오프셋이 병렬성과 순서를 어떻게 가르는지, 파티셔닝 키와 핫 파티션·파티션 수 결정의 트레이드오프, 그리고 리더/팔로워 ...
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 같은 매크로 패키지와 과도한 매크로화의 경계까지 다룹니다.
Airflow를 프로덕션에 올리는 마지막 단계 — 스케줄러·웹서버·triggerer·메타데이터 DB의 배포 구성과 KubernetesExecutor의 task-per-pod 실행, 원격 로깅·메트릭·SLA 경보, 그리고 Secrets 관리·스케줄러 HA·장애 대응까지 운영 견고성의 전부를 다룹니다.