Skip to content

Split View: 2026년 데이터 도구 지형 읽는 법 — 도구 목록이 아니라 층별 결정으로

✨ Learn with Quiz
|

2026년 데이터 도구 지형 읽는 법 — 도구 목록이 아니라 층별 결정으로

들어가며 — 51포인트짜리 지도, 그리고 지도가 정해 주지 않는 것

2026년 7월 28일 GeekNews에 개발자를 위한 데이터 도구 지형 가이드가 올라와 51포인트를 받았습니다. 원문은 데이터 쪽에 처음 발을 들인 소프트웨어 개발자를 대상으로, 수집부터 저장·처리·오케스트레이션·소비·거버넌스까지 한 바퀴를 훑습니다. 파일 포맷(CSV, Parquet, ORC, Avro, Arrow), 창고와 레이크와 레이크하우스, 수집 도구(Fivetran, Airbyte, dlt, Debezium), 변환(dbt, SQLMesh), 분산 처리(Spark, Dask, Ray, Flink), 오케스트레이션(Airflow, Dagster, Prefect), 메달리온 아키텍처, 시맨틱 레이어와 카탈로그, BI 도구까지 — 목록으로서 충실합니다.

좋은 지도입니다. 그런데 지도는 목적지를 정해 주지 않습니다. 이 분야의 진짜 어려움은 "Airbyte와 Fivetran 중 무엇인가"가 아니라 이 층에서 내가 실제로 내리고 있는 결정이 무엇인가를 모른 채 도구를 고르는 데 있습니다. 그래서 6개월 뒤에 같은 층에서 같은 고민을 다시 합니다.

이 글은 같은 지형을 다시 그리되, 각 층에서 도구 이름 대신 결정의 축을 세우는 방식으로 정리합니다. 그리고 2026년 현재 그 축들이 어디서 무너지고 있는지를 짚습니다.

다섯 개 층과 각 층의 진짜 결정

층을 나누는 방식은 여러 가지지만, 결정의 성격이 다른 지점으로 자르면 다섯 개가 나옵니다.

흔히 나열되는 도구이 층의 진짜 결정경계가 무너지는 방향
수집Fivetran, Airbyte, dlt, Debezium커넥터를 사는가 소유하는가변환 벤더가 수집까지 흡수
저장 · 테이블 포맷S3, Snowflake, BigQuery, Iceberg, Delta, Hudi데이터가 누구의 저장소에 있는가포맷은 수렴, 잠금은 카탈로그로 이동
변환dbt, SQLMesh, SparkSQL을 어디서 컴파일하고 어디서 실행하는가컴파일러와 엔진의 분리
오케스트레이션Airflow, Dagster, Prefect실패했을 때 무엇이 자동으로 복구되는가태스크 그래프에서 자산 그래프로
서빙 · 소비ClickHouse, Druid, Pinot, Tableau, Metabase, Cube지표 정의가 어디에 한 벌로 있는가시맨틱 레이어가 카탈로그로 흡수

세 번째 열이 이 글의 전부입니다. 도구 이름은 3년마다 바뀌지만 저 질문들은 바뀌지 않습니다. 아래에서 하나씩 봅니다.

수집 — 결정은 커넥터가 아니라 소유권

수집 층에서 사람들이 비교하는 것은 대개 커넥터 개수와 가격입니다. 실제로 갈리는 것은 다른 축입니다.

커넥터를 유지보수할 것인가, 남에게 맡길 것인가. 세일즈포스나 스트라이프 같은 SaaS API는 스키마가 예고 없이 바뀌고 레이트 리밋이 조용히 조여지고 페이지네이션 방식이 어느 날 달라집니다. 관리형 수집 서비스의 값어치는 커넥터 자체가 아니라 그 변경을 대신 쫓아 주는 인력입니다. 반대로 소스가 내부 Postgres 몇 개뿐이라면 그 인력은 사지 않아도 되는 것이고, 이때 관리형 서비스의 행 단위 과금은 순수한 낭비가 됩니다.

변경 데이터 캡처가 필요한가. 배치로 전체를 다시 읽는 것과 WAL을 읽어 변경만 흘려보내는 것은 운영 부담이 완전히 다릅니다. Debezium 계열의 CDC는 소스 DB에 논리 복제 슬롯을 잡아야 하고, 슬롯이 밀리면 원본 DB의 디스크가 찹니다 — 즉 수집 파이프라인의 장애가 프로덕션 DB의 장애로 번지는 경로가 생깁니다. 이 위험을 감수할 만큼 신선도가 중요한지가 실제 결정입니다.

추출한 데이터의 스키마를 누가 정의하는가. 원본 스키마를 그대로 복사하는 방식(ELT의 기본값)은 시작이 빠르지만, 소스 팀이 컬럼을 지우면 하류 전체가 깨집니다. 계약을 명시하는 방식은 느리지만 그 파손이 수집 지점에서 멈춥니다. 조직의 크기가 이 선택을 결정합니다 — 소스 팀과 데이터 팀이 같은 방에 있으면 전자로 충분하고, 부서가 다르면 후자가 필요합니다.

파이썬 라이브러리로 파이프라인을 직접 쓰는 선택지(dlt 계열)가 최근 힘을 받는 이유도 여기 있습니다. 커넥터를 소유하되 상용구는 라이브러리에 맡기는 중간 지대이고, 소스가 10개 이하일 때 대체로 가장 싸게 먹힙니다.

저장 — 포맷 전쟁은 끝났고, 싸움은 카탈로그로 옮겨 갔다

몇 년 동안 이 층의 질문은 "Iceberg냐 Delta냐 Hudi냐"였습니다. 2026년 현재 그 질문은 대체로 닫혔습니다.

Iceberg v3 명세가 2025년 중반에 비준됐고, 1.10~1.11 릴리스 계열을 거치며 삭제 벡터(deletion vectors), 반정형 데이터를 위한 variant 타입, 행 계보(row lineage), 지리공간 타입이 들어갔습니다. Snowflake, Databricks, Amazon S3 Tables가 모두 v3 지원을 GA로 선언했습니다. 여기서 중요한 것은 v3가 흡수한 기능들이 원래 Delta Lake의 차별점이었다는 점입니다. 삭제 벡터와 행 계보가 Iceberg에 들어오면서 "성능이냐 상호운용성이냐"라는 선택 자체가 사라졌습니다. Databricks는 한 발 더 나가 Iceberg v4의 적응형 메타데이터 트리를 제안하면서 Delta 5.0도 같은 구조를 채택하자고 밝혔습니다. 방향은 수렴입니다.

포맷이 수렴하면 잠금은 어디로 가느냐 — 카탈로그입니다. 어떤 테이블이 존재하고 그 최신 메타데이터 파일이 무엇인지 알려 주는 서비스이고, 여기에 접근 제어와 감사와 자격 증명 벤딩이 붙습니다. Iceberg REST 카탈로그 명세가 사실상의 인터페이스가 됐고, Apache Polaris·Unity Catalog·AWS Glue·각 클라우드의 구현이 그 위에서 경쟁합니다.

그리고 카탈로그 계층은 아직 고르지 않습니다. v3 기능은 카탈로그 API를 타고 들어가는데, 모든 카탈로그가 v3 테이블 생성을 지원하지는 않습니다 — 2026년 중반 기준으로 AWS Glue는 REST의 CreateTable 경로로 v3 테이블을 만들지 못하는 것으로 보고돼 있습니다(엔진 쪽에서는 다룰 수 있습니다). "Iceberg를 쓴다"는 말이 이제 충분한 서술이 아니라는 뜻입니다. 실제로 물어야 할 것은 이렇습니다.

  • 어떤 카탈로그를 쓰는가, 그리고 그 카탈로그를 다른 것으로 바꿀 때 데이터를 다시 쓰지 않아도 되는가
  • 우리 엔진들(Spark, Trino, DuckDB, 각 창고)이 그 카탈로그의 REST 구현으로 붙을 수 있는가
  • 쓰기 권한을 가진 엔진이 몇 개인가 — 여럿이면 동시 쓰기 충돌 처리를 누가 보장하는가

이 셋을 말이 아니라 손으로 확인하는 방법이 있습니다. 벤더의 콘솔이 아닌 도구로 같은 테이블을 읽어 보는 것입니다. 30분이면 끝나고, 개방성 주장에 대한 가장 정직한 검증입니다.

-- DuckDB에서 REST 카탈로그에 직접 붙어 본다.
-- 창고 콘솔을 거치지 않고 이게 되면, 그 테이블은 실제로 열려 있다.
INSTALL iceberg; LOAD iceberg;
INSTALL httpfs;  LOAD httpfs;

CREATE SECRET catalog_auth (
    TYPE ICEBERG,
    CLIENT_ID     'svc-analytics',
    CLIENT_SECRET 'redacted'
);

ATTACH 'my_warehouse' AS lake (
    TYPE ICEBERG,
    ENDPOINT 'https://catalog.internal.example.com/api/catalog'
);

SHOW ALL TABLES;
SELECT count(*) FROM lake.analytics.orders WHERE order_date >= DATE '2026-07-01';

-- 스냅샷 이력이 보이면 시간 여행과 롤백도 우리 것이다
SELECT * FROM iceberg_snapshots('lake.analytics.orders');
# 카탈로그를 거치지 않고 객체 저장소만 보고도 테이블 구조가 남아 있는지
aws s3 ls s3://lake-prod/analytics/orders/metadata/ --human-readable | tail -5
# v00042-....metadata.json 과 snap-....avro 가 보이면
# 카탈로그를 갈아 끼워도 데이터는 그대로다

행 계보처럼 v3에서 새로 들어온 기능이 실제로 어떻게 저장되고 무엇을 보장하는지는 Iceberg v3 로우 리니지 — 행 ID는 파일에 저장되지 않는다 편에 따로 정리해 두었습니다.

한편 이 층에는 다른 방향의 도전자도 있습니다. DuckDB 재단이 만든 DuckLake는 메타데이터를 파일 트리로 관리하는 대신 SQL 데이터베이스에 넣습니다. 카탈로그 백엔드로 PostgreSQL, SQLite, DuckDB를 쓸 수 있고, 데이터는 여전히 Parquet입니다. v1.0이 2026년 4월에 하위 호환 보장과 함께 나왔습니다. 논지는 단순합니다 — 메타데이터 조회는 원래 데이터베이스가 잘하는 일인데, 왜 객체 저장소 위의 파일 트리를 뒤지고 있느냐는 것입니다. 다만 채택 규모는 Iceberg와 비교할 단계가 아니고, 여러 엔진이 함께 쓰는 조직 표준으로 삼기에는 아직 이릅니다.

변환과 오케스트레이션 — 컴파일러의 자리, 그리고 실패 처리 모델

변환 층의 진짜 결정은 "SQL을 어디서 컴파일하고 어디서 실행하는가"입니다. dbt 계열 도구는 데이터를 직접 만지지 않습니다. SQL 템플릿을 펼쳐 의존 그래프를 만들고, 창고의 방언으로 컴파일해 던지고, 결과를 테이블이나 뷰로 물질화합니다. 즉 컴파일러이자 빌드 시스템입니다. 그래서 이 층에서 실제로 물어야 할 것은 이렇습니다.

  • 모델 사이 의존 그래프를 도구가 정적으로 알 수 있는가, 아니면 실행해 봐야 아는가. 정적으로 안다면 영향 분석과 부분 재실행이 가능합니다.
  • 컴파일 결과가 어느 엔진에서든 돌아가는가. 창고를 바꿀 때 변환 코드를 얼마나 다시 써야 하는지가 여기서 갈립니다.
  • 증분 물질화의 정확성을 누가 보장하는가. 늦게 도착한 데이터와 백필이 이 층에서 가장 많은 버그를 만듭니다.

이 셋을 놓고 보면 최근 몇 년의 움직임이 읽힙니다. 파이썬 템플릿 문자열을 렌더링하는 방식에서 SQL을 실제로 파싱해 열 단위 계보까지 정적으로 아는 방식으로 옮겨 가고 있고, dbt Fusion 엔진과 SQLMesh가 같은 방향입니다.

오케스트레이션 층의 진짜 결정은 스케줄링이 아니라 실패 처리입니다. cron으로도 스케줄은 됩니다. 오케스트레이터를 도입하는 이유는 "3시 작업이 실패했을 때 5시 작업이 자동으로 멈추고, 원인을 고친 뒤 그 두 개만 다시 도는" 동작 때문입니다. 그래서 물어야 할 것은 이렇습니다.

  • 실패의 단위가 태스크인가 데이터 자산인가. 후자면 "이 테이블이 최신인가"를 시스템이 알고 있고, 재실행 범위를 스스로 계산합니다.
  • 백필이 일급 개념인가. 지난 90일을 다시 도는 일이 버튼 하나인지 임시 스크립트인지가 운영 부담을 결정합니다.
  • 스트리밍은 이 그래프에 들어오는가. 대부분의 오케스트레이터는 배치 DAG를 위한 것이고, 스트리밍 파이프라인은 다른 수명 주기를 갖습니다. 억지로 한 도구에 넣으면 양쪽 다 어색해집니다.

Airflow 2가 EOL을 지나면서 이 층은 지금 실제로 이사 중입니다. 3.x로 옮길 때 무엇이 실제 작업 목록인지는 Airflow 2 EOL 이후 — 2에서 3으로 가는 실제 작업 목록 편에 정리해 두었습니다.

경계가 무너지는 지점 — 계산이 로컬로 당겨진다

지난 10년의 기본 가정은 "데이터가 크니 클러스터로 간다"였습니다. 이 가정이 두 방향에서 침식되고 있습니다.

하나는 하드웨어입니다. 노트북에 32~64GB 메모리가 흔해지고 NVMe가 GB/s 단위로 읽습니다. 그리고 대부분의 분석 쿼리가 실제로 만지는 데이터는 사람들이 생각하는 것보다 훨씬 작습니다 — 컬럼 지향 저장에서 필요한 컬럼만, 파티션 프루닝으로 필요한 파티션만 읽으면 테라바이트 테이블에서 수백 MB만 스캔하는 경우가 흔합니다.

다른 하나는 단일 노드 엔진의 성숙입니다. DuckDB, Polars, DataFusion은 벡터화 실행과 메모리보다 큰 데이터의 디스크 스필을 갖췄고, S3의 Parquet과 Iceberg 테이블을 직접 읽습니다. 결과적으로 "클러스터를 띄우고 노트북을 붙여 SQL 한 줄 돌리기"가 필요했던 작업의 상당 부분이 단일 바이너리로 내려왔습니다.

이 흐름이 만드는 실무적 변화는 세 가지입니다.

  • 개발 루프가 짧아집니다. 변환 로직을 로컬에서 실제 데이터 샘플로 돌려 보고 커밋합니다. 클러스터 대기열이 사라집니다.
  • 비용 구조가 바뀝니다. 창고의 컴퓨트 과금은 쿼리 단위인데, 탐색적 분석이 로컬로 내려가면 그 청구서가 사라집니다.
  • 경계가 흐려집니다. DuckDB에 클라이언트-서버 프로토콜이 생기면서(2026년 5월 v1.5.3의 Quack 원격 프로토콜) "임베디드 엔진"과 "쿼리 서비스"의 구분이 애매해졌습니다. 이 변화가 실제로 무엇을 바꾸고 무엇을 바꾸지 않는지는 DuckDB에 클라이언트-서버 프로토콜이 생겼다 편에서 다뤘습니다.

물론 클러스터가 사라지는 것은 아닙니다. 갈리는 지점은 명확합니다 — 한 번의 쿼리가 만지는 데이터가 한 대의 메모리와 디스크에 들어가는가, 그리고 여러 사람이 동시에 그 작업을 하는가입니다. 전자가 아니면 분산이 필요하고, 후자면 서버가 필요합니다. 조직 전체의 야간 배치를 로컬 엔진으로 돌리겠다는 계획은 대개 6개월 뒤에 후회합니다. 반대로 분석가 한 명의 탐색을 위해 Spark 클러스터를 띄우는 것도 마찬가지입니다.

Spark 쪽도 가만히 있지는 않아서, 파이썬 UDF 경로가 Arrow 기반으로 재정비되며 파이썬과 JVM 사이의 직렬화 비용이 크게 줄었습니다 — PySpark 4.2의 Arrow UDF 기본화 편을 참고하세요.

시장은 어디로 합쳐지고 있나

층별 결정을 이야기했으니 그 층들이 하나로 합쳐지는 흐름도 봐야 합니다. 2026년의 가장 큰 사건은 Fivetran과 dbt Labs의 합병입니다. 2025년 10월 13일에 발표돼 2026년 6월 1일에 완료됐고, 전량 주식 교환이었으며, 보도자료 기준으로 10만 개가 넘는 데이터 팀을 상대합니다. George Fraser가 CEO, Tristan Handy가 President입니다. (합산 ARR 규모로 자주 인용되는 숫자가 있지만 보도자료에는 수치가 없어, 여기서는 인용하지 않겠습니다.)

이 합병의 의미는 앞 표의 네 번째 열입니다. 수집과 변환이 한 회사로 묶였습니다. 그동안 "수집은 A, 저장은 B, 변환은 C, 오케스트레이션은 D"로 각 층의 최선을 조립하는 것이 모던 데이터 스택의 미덕이었는데, 그 조립 비용(메타데이터가 층마다 끊기고, 계보가 이어지지 않고, 실패 원인을 층을 넘나들며 추적해야 하는)이 실제로 컸다는 인정이기도 합니다.

동시에 이 회사가 겨누는 상대는 명확합니다 — Snowflake, Databricks, Microsoft Fabric 같은 올인원 플랫폼입니다. 그리고 차별점으로 내세우는 것이 개방 표준입니다. SQL과 Iceberg 위에 서겠다는 것이고, 실제로 dbt Fusion 엔진 런타임을 Apache 2.0으로 dbt Core v2.0(알파)에 넣었습니다.

여기서 읽을 것은 두 가지입니다.

첫째, 층의 경계가 벤더 경계와 일치하지 않게 됩니다. "우리는 층별 최적 도구를 쓴다"는 전략이 실제로는 "우리는 세 개 벤더의 번들을 쓴다"가 되고 있습니다. 도구를 고를 때 그 도구가 속한 번들이 무엇을 함께 끌고 오는지를 봐야 합니다.

둘째, 통합의 대가는 언제나 이동 비용입니다. 개방 포맷 위에 있다는 약속이 실질적인지 확인하는 방법은 하나뿐입니다 — 벤더를 지웠을 때 무엇이 남는지 세어 보는 것입니다. 테이블이 Iceberg로 남고 카탈로그를 다른 구현으로 가리킬 수 있고 변환 SQL이 다른 엔진에서 돌면, 그 약속은 실질적입니다. 셋 중 하나라도 아니라면 마케팅입니다.

도구를 실제로 고르는 여섯 개의 질문

층별 결정을 하나의 체크리스트로 압축하면 이렇습니다. 벤더 비교표보다 이쪽이 훨씬 빨리 답을 좁힙니다.

  1. 이 데이터를 누가 읽는가, 그리고 얼마나 신선해야 하는가. 대시보드를 아침에 보는 사람들뿐이라면 배치로 끝나고, 제품 화면에 들어간다면 서빙 계층과 지연 예산이 필요합니다. 이 질문 하나가 스트리밍 도입 여부를 대부분 결정합니다.
  2. 가장 큰 단일 쿼리가 만지는 데이터가 한 대에 들어가는가. 들어가면 분산 엔진은 아직 필요 없습니다. 앞 절의 경계입니다.
  3. 이 파이프라인이 실패하면 무엇이 자동으로 복구되고 무엇을 사람이 해야 하는가. 여기서 답이 "전부 사람"이면 오케스트레이터가 아니라 운영 모델을 먼저 고쳐야 합니다.
  4. 지표의 정의가 어디에 한 벌로 있는가. BI 도구와 노트북과 제품 코드가 각자 "활성 사용자"를 계산하고 있다면, 도구를 하나 더 사는 것으로 해결되지 않습니다.
  5. 이 도구를 지웠을 때 데이터는 어디에 어떤 형태로 남는가. 개방 포맷이라는 주장을 검증하는 유일한 질문입니다.
  6. 이걸 운영할 사람이 몇 명인가. 가장 자주 무시되고 가장 자주 프로젝트를 죽이는 질문입니다. Airflow 하나를 제대로 운영하는 데도 사람이 필요합니다. 두 명짜리 팀이 다섯 개 층을 자체 운영하기로 결정하면, 6개월 뒤 그 팀은 데이터 일이 아니라 인프라 일을 하고 있습니다.

원문 가이드가 마지막에 다루는 거버넌스가 사실 6번과 같은 이야기입니다. 접근 제어, 소유권, 개인정보 계보, 보존 정책은 도구로 사는 것이 아니라 사람이 수행하는 것이고, 도구는 그 수행을 싸게 만들어 줄 뿐입니다.

마치며 — 지형은 바뀌어도 질문은 남는다

정리하면 이렇습니다.

  • 층별로 도구를 고르는 것이 아니라 층별 결정을 먼저 명확히 하고, 그 결정에 맞는 도구를 고릅니다. 도구 목록은 3년마다 바뀌고 결정의 축은 그대로입니다.
  • 테이블 포맷 전쟁은 Iceberg v3가 Delta의 차별 기능들을 흡수하면서 사실상 끝났습니다. 실질적인 잠금과 거버넌스는 카탈로그 계층으로 옮겨 갔고, 카탈로그 구현들은 아직 기능이 고르지 않습니다.
  • 단일 노드 엔진이 클러스터의 일을 상당 부분 로컬로 당겨 왔습니다. 갈리는 기준은 데이터 크기 자체가 아니라 "한 대에 들어가는가"와 "여러 사람이 동시에 하는가"입니다.
  • 시장은 층을 가로질러 합쳐지고 있습니다. Fivetran과 dbt Labs의 합병이 그 신호이고, 대응 축은 개방 포맷 위에 서 있는지를 실제로 검증하는 것입니다.
  • 도구 선택은 대개 여섯 개 질문 안에서 끝납니다. 그중 마지막 질문(운영할 사람이 몇 명인가)이 가장 자주 무시됩니다.

지형도는 유용하지만, 지형도를 외우는 것과 길을 정하는 것은 다른 일입니다. 다음에 도구 비교표를 열기 전에, 그 층에서 자신이 무슨 결정을 하고 있는지부터 한 문장으로 써 보길 권합니다. 그 문장이 안 써지면 비교표는 도움이 되지 않습니다.

참고 자료

How to Read the 2026 Data Tooling Landscape — Layer-by-Layer Decisions, Not a Tool List

Introduction — A 51-Point Map, and What a Map Doesn't Decide for You

On July 28, 2026, A Data Tooling Landscape Guide for Developers landed on GeekNews and picked up 51 points. The original post targets software developers who are just setting foot in data for the first time, and walks through the whole loop from ingestion to storage, processing, orchestration, consumption, and governance. File formats (CSV, Parquet, ORC, Avro, Arrow), warehouses versus lakes versus lakehouses, ingestion tools (Fivetran, Airbyte, dlt, Debezium), transformation (dbt, SQLMesh), distributed processing (Spark, Dask, Ray, Flink), orchestration (Airflow, Dagster, Prefect), the medallion architecture, semantic layers and catalogs, and BI tools — as a list, it's thorough.

It's a good map. But a map doesn't choose your destination for you. The real difficulty in this field isn't "Airbyte or Fivetran" — it's picking a tool without knowing what decision you're actually making at this layer. So six months later, you're having the same argument at the same layer all over again.

This post redraws the same landscape, but instead of tool names at each layer, it builds around the axis of decision. And it flags where, as of 2026, those axes are starting to buckle.

Five Layers, and the Real Decision at Each One

There are several ways to slice the layers, but cutting at the points where the nature of the decision changes gives you five.

LayerCommonly listed toolsThe real decision at this layerDirection the boundary is collapsing
IngestionFivetran, Airbyte, dlt, DebeziumDo you buy the connector, or own itTransformation vendors absorbing ingestion
Storage / table formatS3, Snowflake, BigQuery, Iceberg, Delta, HudiWhose storage is the data actually inFormats converging; lock-in moving to the catalog
Transformationdbt, SQLMesh, SparkWhere does SQL get compiled, and where does it runCompiler splitting away from the engine
OrchestrationAirflow, Dagster, PrefectWhat recovers automatically when something failsMoving from task graphs to asset graphs
Serving / consumptionClickHouse, Druid, Pinot, Tableau, Metabase, CubeWhere does the single definition of a metric liveSemantic layers being absorbed into the catalog

That third column is the entire point of this post. Tool names change every three years; those questions don't. Let's go through them one at a time below.

Ingestion — The Decision Is Ownership, Not Connectors

At the ingestion layer, what people usually compare is connector count and price. What actually diverges is a different axis.

Do you maintain the connector, or hand it to someone else. SaaS APIs like Salesforce or Stripe change schema without warning, quietly tighten rate limits, and shift pagination one day without notice. The value of a managed ingestion service isn't the connector itself — it's the headcount that chases those changes for you. Conversely, if your sources are just a handful of internal Postgres instances, you don't need to buy that headcount, and a managed service's per-row pricing becomes pure waste.

Do you need change data capture. Batch-rereading everything and streaming only the changes off a WAL are operationally worlds apart. Debezium-style CDC has to hold a logical replication slot on the source database, and if the slot falls behind, the source DB's disk fills up — which means a failure in the ingestion pipeline can cascade into a failure of the production DB. Whether freshness matters enough to take on that risk is the real decision here.

Who defines the schema of the extracted data. Copying the source schema as-is (ELT's default) gets you started fast, but if the source team drops a column, everything downstream breaks. Specifying an explicit contract is slower, but the breakage stops at the ingestion point. Organization size determines this choice — if the source team and the data team sit in the same room, the former is enough; if they're in different departments, you need the latter.

This is also why writing pipelines directly with a Python library (the dlt family) has gained traction lately. It's the middle ground where you own the connector but hand the boilerplate to the library, and it's generally the cheapest option when you have ten sources or fewer.

Storage — the Format War Is Over, and the Fight Moved to the Catalog

For years the question at this layer was "Iceberg, Delta, or Hudi." As of 2026, that question is largely settled.

The Iceberg v3 spec was ratified in mid-2025, and through the 1.10–1.11 release line it picked up deletion vectors, a variant type for semi-structured data, row lineage, and geospatial types. Snowflake, Databricks, and Amazon S3 Tables have all declared v3 support GA. What matters here is that the features v3 absorbed were originally Delta Lake's points of differentiation. With deletion vectors and row lineage now in Iceberg, the very choice between "performance or interoperability" has disappeared. Databricks went a step further, proposing an adaptive metadata tree for Iceberg v4 and saying Delta 5.0 would adopt the same structure. The direction is convergence.

Once formats converge, where does lock-in go — the catalog. This is the service that tells you which tables exist and where their latest metadata files are, and access control, auditing, and credential vending attach here. The Iceberg REST catalog spec has become the de facto interface, and Apache Polaris, Unity Catalog, AWS Glue, and each cloud's own implementation compete on top of it.

And the catalog layer still isn't uniform. v3 features flow through the catalog API, and not every catalog supports creating v3 tables — as of mid-2026, AWS Glue is reported not to be able to create v3 tables through the REST CreateTable path (engines can still handle it on their side). Which means saying "we use Iceberg" is no longer a sufficient description. What you actually need to ask is this:

  • Which catalog are you using, and if you switch catalogs, do you have to rewrite the data
  • Can your engines (Spark, Trino, DuckDB, each warehouse) attach to that catalog's REST implementation
  • How many engines have write access — and if more than one, who guarantees handling of concurrent write conflicts

There's a way to check these three things by hand instead of by argument: read the same table with a tool other than the vendor's own console. It takes thirty minutes, and it's the most honest test of an openness claim.

-- Attach directly to a REST catalog from DuckDB.
-- If this works without going through the warehouse's console, the table is genuinely open.
INSTALL iceberg; LOAD iceberg;
INSTALL httpfs;  LOAD httpfs;

CREATE SECRET catalog_auth (
    TYPE ICEBERG,
    CLIENT_ID     'svc-analytics',
    CLIENT_SECRET 'redacted'
);

ATTACH 'my_warehouse' AS lake (
    TYPE ICEBERG,
    ENDPOINT 'https://catalog.internal.example.com/api/catalog'
);

SHOW ALL TABLES;
SELECT count(*) FROM lake.analytics.orders WHERE order_date >= DATE '2026-07-01';

-- If snapshot history shows up, time travel and rollback are yours too
SELECT * FROM iceberg_snapshots('lake.analytics.orders');
# Check, without going through the catalog, whether the table structure survives
# by looking at the object store alone
aws s3 ls s3://lake-prod/analytics/orders/metadata/ --human-readable | tail -5
# If you see v00042-....metadata.json and snap-....avro,
# the data survives even if you swap out the catalog

How a v3-era feature like row lineage is actually stored and what it guarantees is covered separately in Iceberg v3 Row Lineage — Row IDs Aren't Stored in the File.

Meanwhile, this layer also has a challenger coming from a different direction. DuckLake, built by the DuckDB Foundation, manages metadata not as a file tree but by putting it in a SQL database. You can use PostgreSQL, SQLite, or DuckDB as the catalog backend, and the data itself stays Parquet. v1.0 shipped in April 2026 with a backward-compatibility guarantee. The argument is simple — metadata lookups are exactly what a database is already good at, so why are we digging through a file tree on top of object storage instead? That said, adoption isn't at a scale comparable to Iceberg yet, and it's still early to adopt as an organization-wide standard shared across multiple engines.

Transformation and Orchestration — Where the Compiler Sits, and the Failure-Handling Model

The real decision at the transformation layer is "where does the SQL get compiled, and where does it run." dbt-family tools never touch data directly. They expand SQL templates into a dependency graph, compile it into the warehouse's dialect and dispatch it, and materialize the result as a table or view. In other words, it's a compiler and a build system at once. So what you actually need to ask at this layer is:

  • Can the tool know the dependency graph between models statically, or only by running it? If it knows statically, impact analysis and partial re-runs become possible.
  • Does the compiled output run on any engine? How much transformation code you'd need to rewrite when switching warehouses hinges on this.
  • Who guarantees the correctness of incremental materialization? Late-arriving data and backfills produce more bugs at this layer than anything else.

Looking at these three together, you can read the movement of the last few years. The industry is shifting from rendering Python template strings toward actually parsing SQL to statically know column-level lineage, and dbt's Fusion engine and SQLMesh are both headed the same direction.

The real decision at the orchestration layer isn't scheduling — it's failure handling. cron can schedule things too. The reason you adopt an orchestrator is the behavior where "when the 3am job fails, the 5am job automatically halts, and once the cause is fixed, only those two re-run." So what you need to ask is:

  • Is the unit of failure a task, or a data asset? With the latter, the system knows whether "this table is up to date" and computes the scope of a re-run itself.
  • Is backfill a first-class concept? Whether re-running the last 90 days is a single button or an ad hoc script determines your operational burden.
  • Does streaming fit into this graph at all? Most orchestrators are built for batch DAGs, and streaming pipelines have a different lifecycle. Force it into one tool and both ends end up awkward.

Airflow 2 has passed EOL, so this layer is genuinely in the middle of moving right now. What the real task list looks like when migrating to 3.x is covered in After Airflow 2's EOL — the Real Task List from 2 to 3.

Where the Boundaries Are Collapsing — Compute Gets Pulled Back to the Local Machine

The default assumption of the last decade was "data is big, so it goes to a cluster." That assumption is eroding from two directions.

One is hardware. 32–64GB of memory is now common on a laptop, and NVMe reads at gigabytes per second. And the data most analytical queries actually touch is far smaller than people assume — with columnar storage reading only the needed columns, and partition pruning reading only the needed partitions, it's common to scan just a few hundred MB out of a terabyte-scale table.

The other is the maturity of single-node engines. DuckDB, Polars, and DataFusion now have vectorized execution and disk-spilling for data larger than memory, and they read Parquet and Iceberg tables on S3 directly. As a result, a substantial share of the work that used to require "spin up a cluster and point your laptop at it to run one line of SQL" has come down to a single binary.

This shift creates three practical changes.

  • The development loop gets shorter. You run transformation logic locally against an actual data sample and commit. Cluster queues disappear.
  • The cost structure changes. A warehouse's compute billing is per query, and when exploratory analysis moves local, that bill disappears.
  • The boundary blurs. With DuckDB gaining a client-server protocol (the Quack remote protocol in v1.5.3, May 2026), the line between an "embedded engine" and a "query service" has gotten fuzzy. What that change actually alters and what it doesn't is covered in DuckDB Now Has a Client-Server Protocol.

Clusters aren't disappearing, of course. The line is clear — does the data touched by a single query fit in one machine's memory and disk, and are multiple people doing that work at the same time. If the answer to the first is no, you need distribution; if the answer to the second is yes, you need a server. A plan to run an entire organization's overnight batch on a local engine is usually regretted six months later. So is spinning up a Spark cluster for one analyst's exploratory work.

Spark hasn't been standing still either — its Python UDF path has been rebuilt on Arrow, cutting serialization cost between Python and the JVM substantially. See PySpark 4.2 Makes Arrow UDFs the Default.

Where the Market Is Consolidating

Having covered the decision at each layer, we should also look at how those layers are merging into one. The biggest event of 2026 is the merger of Fivetran and dbt Labs. Announced October 13, 2025 and completed June 1, 2026, it was an all-stock deal, and per the press release the combined company serves more than 100,000 data teams. George Fraser is CEO, Tristan Handy is President. (A combined-ARR figure gets cited often, but the press release itself has no number, so I won't quote one here.)

The significance of this merger is the fourth column of the table above. Ingestion and transformation are now under one roof. It used to be a virtue of the modern data stack to assemble the best tool at each layer — "ingestion from A, storage from B, transformation from C, orchestration from D" — and this merger is also an admission that the cost of that assembly (metadata breaking at every layer boundary, lineage not carrying through, having to trace failure causes across layers) was, in practice, substantial.

At the same time, this company's target is clear — all-in-one platforms like Snowflake, Databricks, and Microsoft Fabric. And what it's positioning as its differentiator is open standards. It's staking its position on SQL and Iceberg, and has in fact put the dbt Fusion engine runtime into dbt Core v2.0 (alpha) under Apache 2.0.

Two things are worth taking away here.

First, layer boundaries no longer line up with vendor boundaries. The strategy of "we use the best tool at each layer" is, in practice, becoming "we use a bundle from three vendors." When picking a tool, you need to look at what else the bundle it belongs to drags in with it.

Second, the price of consolidation is always migration cost. There's exactly one way to check whether the promise of sitting on open formats is real — count what's left after you delete the vendor. If tables remain in Iceberg, the catalog can be pointed at a different implementation, and the transformation SQL runs on a different engine, the promise is real. If any one of the three doesn't hold, it's marketing.

Six Questions That Actually Decide Which Tool You Pick

Compressed into a single checklist, the per-layer decisions come out to this. It narrows down an answer far faster than a vendor comparison chart.

  1. Who reads this data, and how fresh does it need to be? If it's only people looking at a dashboard in the morning, batch is enough; if it feeds a product surface, you need a serving layer and a latency budget. This one question mostly decides whether you need streaming at all.
  2. Does the data touched by your single biggest query fit on one machine? If it does, you don't need a distributed engine yet — this is the boundary from the previous section.
  3. When this pipeline fails, what recovers automatically, and what does a human have to do? If the answer here is "a human does everything," fix the operating model before you reach for an orchestrator.
  4. Where does the single definition of a metric live? If a BI tool, a notebook, and product code are each computing "active users" on their own, buying one more tool won't fix it.
  5. If you deleted this tool, where and in what form would the data remain? This is the only question that actually tests an open-format claim.
  6. How many people do you have to run this? The most frequently ignored question, and the one that most often kills a project. Even running a single Airflow instance well takes people. A two-person team that decides to self-operate all five layers finds itself, six months later, doing infrastructure work instead of data work.

The governance the original guide covers at the end is, in effect, the same story as question 6. Access control, ownership, PII lineage, and retention policy aren't something you buy as a tool — they're something people carry out, and the tool only makes carrying it out cheaper.

Conclusion — the Landscape Changes, But the Questions Remain

To sum up.

  • Instead of picking a tool per layer, get the decision at that layer clear first, then pick the tool that fits that decision. The tool list changes every three years; the axis of decision doesn't.
  • The table-format war has effectively ended with Iceberg v3 absorbing Delta's differentiating features. Real lock-in and governance have moved to the catalog layer, and catalog implementations still aren't uniform in what they support.
  • Single-node engines have pulled a substantial share of cluster work back to the local machine. The line isn't data size itself — it's "does it fit on one machine" and "are multiple people doing it at once."
  • The market is consolidating across layers. The Fivetran/dbt Labs merger is the signal, and the countermeasure is actually verifying whether a vendor really sits on open formats.
  • Tool selection usually resolves within six questions. The last one — how many people will operate it — is the most frequently ignored.

A landscape map is useful, but memorizing the map and deciding on a route are different things. Before you next open a tool comparison chart, try writing, in one sentence, what decision you're actually making at that layer. If you can't write that sentence, the comparison chart won't help you.

References