惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Security @ Cisco Blogs
小众软件
小众软件
D
Docker
博客园_首页
A
About on SuperTechFans
P
Privacy International News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
Arctic Wolf
Spread Privacy
Spread Privacy
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Latest news
Latest news
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
大猫的无限游戏
大猫的无限游戏
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
V2EX - 技术
V2EX - 技术
SecWiki News
SecWiki News
U
Unit 42
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
S
Security Affairs
Y
Y Combinator Blog
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
T
Tenable Blog
W
WeLiveSecurity
Cloudbric
Cloudbric
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
N
News and Events Feed by Topic
D
DataBreaches.Net
P
Proofpoint News Feed
B
Blog RSS Feed
B
Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
DuckLake 1.0: el formato de data lake que mueve el catálogo de archivos a SQL y promete 926 más velocidad que Iceberg
lu1tr0n · 2026-05-08 · via DEV Community

El 13 de abril de 2026, DuckDB Labs liberó la versión 1.0 de DuckLake, un formato de data lake con backward-compatibility garantizada que rompe con la convención de los últimos cinco años en lakehouses: en lugar de almacenar el catálogo de metadatos como una pila de archivos JSON dispersos en object storage —el patrón que usan Apache Iceberg, Delta Lake y Apache Hudi—, DuckLake lo guarda en una base de datos relacional. La consecuencia técnica es directa, y los benchmarks reportados por el propio equipo son contundentes: 926× más rápido en consultas y 105× más rápido en ingesta frente a Iceberg en cargas de trabajo con muchas escrituras pequeñas, según declaraciones de Pedro Holanda, ingeniero principal de DuckDB Labs, recogidas por The Register.

InfoQ cubrió el lanzamiento el 2 de mayo, firmado por Renato Losio. El anuncio oficial en ducklake.select lista las cinco features principales: data inlining, sorted tables, bucket partitioning, soporte completo para tipos GEOMETRY y VARIANT, y deletion vectors compatibles con Iceberg v3. El repositorio público en GitHub ya está disponible bajo licencia open source y los clientes para Apache DataFusion, Apache Spark, Trino y Pandas son operativos al día del release. MotherDuck ofrece una versión hosteada que gestiona la base de datos del catálogo y el storage subyacente.

Este artículo explica, en términos accesibles para ingenieros de datos y devs que están evaluando lakehouses para 2026, qué es DuckLake exactamente, qué problema concreto resuelve, cómo se integra con el stack actual, y cuándo conviene preferirlo sobre Iceberg o Delta Lake. La cobertura es continuación natural de la línea editorial dev del blog —los posts recientes sobre Bun→Rust, pnpm 11 y Cloudflare Agents Week— en una pieza que toca el lado de datos que estaba sub-cubierto.

El problema que ataca: el "small file problem" en lakehouses

Los lakehouses modernos —Iceberg desde Netflix en 2017, Delta Lake desde Databricks en 2019— resolvieron un problema real: dieron transacciones ACID sobre data lakes que antes eran simplemente "carpetas de archivos Parquet sin orden". Para hacerlo, agregaron una capa de metadata que registra qué archivos componen una tabla en cada momento, qué snapshots existen, qué columnas hay, qué particiones aplican. Esa metadata —archivos JSON, Avro o manifiestos específicos del formato— se guarda junto a los datos en object storage como S3, R2 o GCS.

El problema aparece cuando el patrón de uso no es "ingesta batch grande cada hora". Si un workload incluye escrituras pequeñas frecuentes —insertar una fila, actualizar diez registros, borrar una tupla— el resultado es que cada operación genera al menos un archivo Parquet nuevo (Parquet está optimizado para millones de filas, no para una sola) más uno o varios archivos de metadata para registrar el cambio. Hannes Mühleisen, cofundador y CEO de DuckDB Labs, lo describió a The Register con esta cita:

"You make a small change to your table, adding a single row, and it affects data lake performance because... a new file has to be written... and then a bunch of metadata."

El costo se acumula. Tras pocos miles de escrituras pequeñas un usuario termina con decenas de miles de archivos diminutos y consultas que tienen que listar y leer todo ese ruido para responder a una pregunta simple. Las "compaction jobs" que se corren periódicamente para fusionar archivos pequeños en archivos grandes ayudan, pero introducen su propio mantenimiento operacional. Y los object stores cobran por requests: 100.000 archivos pequeños cuestan más que 1.000 archivos grandes con el mismo volumen total de datos.

La solución de DuckLake: catálogo en SQL, datos en Parquet

DuckLake invierte la división. Los datos se siguen guardando como Parquet en object storage —compatibilidad total con el ecosistema existente—, pero el catálogo, los snapshots, los metadatos de schema y la lista de archivos se guardan en una base de datos relacional estándar. Los backends soportados oficialmente al día del release 1.0 son tres: DuckDB (sí, DuckDB puede ser su propio catálogo), PostgreSQL y SQLite.

Esto resuelve el problema de los archivos pequeños de raíz. Cuando llega una escritura de 10 filas, DuckLake no escribe un Parquet nuevo. Acumula esa escritura dentro de la base de datos del catálogo —que está optimizada precisamente para muchas operaciones pequeñas con ACID y transacciones reales—, y solo cuando la acumulación cruza un threshold (default: 10 filas, configurable) descarga las filas a Parquet en object storage. La feature se llama data inlining y es una de las cinco piezas de la 1.0.

-- Crear una tabla DuckLake usando PostgreSQL como catálogo
ATTACH 'postgres://user:pwd@host/dbname' AS catalog (TYPE POSTGRES);
USE catalog;

CREATE TABLE events (
  id BIGINT,
  ts TIMESTAMP,
  user_id VARCHAR,
  payload VARIANT
);

-- Inserts pequeños quedan inlineados en el catálogo
INSERT INTO events VALUES (1, NOW(), 'user-42', '{"action": "click"}');
INSERT INTO events VALUES (2, NOW(), 'user-17', '{"action": "view"}');

-- Cuando la acumulación supera el threshold, descarga a Parquet
-- Sin que el usuario tenga que pensarlo

Enter fullscreen mode Exit fullscreen mode

La diferencia operativa para el usuario es ninguna: el SQL es estándar, los datos viven en S3/R2/GCS como siempre, las consultas se responden con Parquet cuando los datos ya están descargados o desde el catálogo cuando todavía no. La diferencia de performance, en cargas de trabajo con muchas escrituras pequeñas, es del orden de los dos órdenes de magnitud.

Las cinco features de la 1.0 en detalle

Data inlining

El threshold por defecto es 10 filas. Por debajo de eso, las filas viven en la tabla del catálogo. Por encima, se descargan a Parquet. El usuario puede configurar el threshold para subir o bajar la frontera según el patrón de carga: cargas con muchas escrituras pequeñas se benefician de un threshold alto (digamos 1.000), mientras que cargas con muy pocas escrituras pequeñas no necesitan inline en absoluto.

Sorted tables

DuckLake permite declarar el orden lógico de las filas dentro de cada archivo Parquet, usando ya sea nombres de columnas o expresiones SQL arbitrarias:

CREATE TABLE sales (
  region VARCHAR, sale_date DATE, amount DECIMAL
)
SET SORTED BY (region ASC, sale_date DESC);

Enter fullscreen mode Exit fullscreen mode

El motor aprovecha el orden para hacer file pruning y row-group pruning en consultas filtradas. Para una consulta que filtre por region = 'eu' y sale_date > '2026-01-01', el motor lee solo los archivos y row-groups que contienen esas combinaciones, sin escanear el resto.

Bucket partitioning

Particionado basado en hash con murmur3 —el mismo algoritmo que usa Iceberg, lo cual permite migración bidireccional sin reorganizar archivos—. Útil para columnas de alta cardinalidad como user_id o session_id donde el particionado por valor (range) sería ineficiente porque hay millones de valores distintos.

Tipos GEOMETRY y VARIANT

GEOMETRY brinda soporte completo para datos espaciales, sin necesidad de extensiones externas como PostGIS para queries geoespaciales básicas. VARIANT es el tipo equivalente a JSON pero con encoding binario y mejor performance. La diferencia importa cuando se almacenan campos semiestructurados —payloads de eventos, metadata flexible— a escala: VARIANT se serializa más rápido y se filtra más rápido que JSON parseado on-the-fly.

Deletion vectors compatibles con Iceberg v3

DuckLake soporta deletion vectors —el mecanismo donde, en vez de reescribir un archivo Parquet entero al borrar filas, se mantiene un bitmap separado que marca qué filas están eliminadas—. La implementación usa archivos Puffin (formato binario para metadata extensible que Iceberg v3 también usa), lo que mantiene compatibilidad bidireccional con tablas Iceberg.

Comparativa contra Iceberg y Delta Lake

Dimensión
Iceberg / Delta
DuckLake 1.0

Catálogo de metadatos
Archivos JSON / Avro en object storage
RDBMS (DuckDB, Postgres, SQLite)

Manejo de escrituras pequeñas
Crea archivos por operación
Data inlining hasta threshold

Compaction jobs
Operacionalmente requeridos
Automáticos vía descarga periódica

Backend de datos
Parquet en S3/R2/GCS
Parquet en S3/R2/GCS (igual)

Soporte SQL multi-cliente
Sí (Trino, Spark, etc.)
Sí (DataFusion, Spark, Trino, Pandas)

Time-travel

Sí, vía ducklake_table_changes()

Branching de datasets
No nativo
Planeado para v2.0

Performance escrituras pequeñas
Baseline
~105× faster (Holanda)

Performance consultas
Baseline
~926× faster (Holanda)

Es importante calibrar los números. 926× más rápido en consultas no es la diferencia que vas a ver en un benchmark cualquiera; es el límite superior medido por el equipo en cargas con muchísimos archivos pequeños donde Iceberg sufre desproporcionadamente. En cargas batch tradicionales —ingesta horaria de millones de filas, sin updates intermedios— la diferencia se reduce a factores cercanos a la paridad, y Iceberg sigue siendo competitivo. La pregunta operativa para un equipo no es "qué formato es más rápido en abstracto" sino "qué formato encaja mejor con mi patrón de uso real".

Cómo empezar: implementación paso a paso

Para un equipo que quiere evaluar DuckLake hoy, el camino mínimo es directo.

Caso A: solo DuckDB local + filesystem

# Instalar DuckDB 1.5.2+ que incluye la extensión DuckLake
curl https://install.duckdb.org | sh

# Lanzar shell interactiva
duckdb

Enter fullscreen mode Exit fullscreen mode

-- Crear un DuckLake con catálogo SQLite + datos en filesystem local
ATTACH 'ducklake:/tmp/my_catalog.sqlite' AS lake (DATA_PATH '/tmp/data/');
USE lake;

CREATE TABLE customers (id INT, name VARCHAR, country VARCHAR);
INSERT INTO customers VALUES (1, 'Ana', 'SV'), (2, 'Bob', 'US');

SELECT * FROM customers;

-- Time-travel: ver cambios en la tabla
SELECT * FROM ducklake_table_changes('customers');

Enter fullscreen mode Exit fullscreen mode

Caso B: producción con catálogo PostgreSQL + datos en S3 / R2

-- Catalogo en Postgres, datos en R2 de Cloudflare
ATTACH 'ducklake:postgres://catalog_user:pwd@db.internal/lake_catalog'
  AS lake
  (DATA_PATH 's3://my-bucket/lake/',
   ENDPOINT 'https://abc123.r2.cloudflarestorage.com',
   ACCESS_KEY_ID 'XXX',
   SECRET 'YYY');

USE lake;

CREATE TABLE events (
  id BIGINT, ts TIMESTAMP, user_id VARCHAR, payload VARIANT
)
SET SORTED BY (ts DESC)
PARTITIONED BY BUCKET(user_id, 16);

-- Inserts pequeños se acumulan, descargas grandes se hacen automáticas
COPY events FROM 'recent_events.parquet';

Enter fullscreen mode Exit fullscreen mode

Caso C: lectura desde Apache Spark

from pyspark.sql import SparkSession

spark = (SparkSession.builder
    .config('spark.jars.packages', 'io.ducklake:ducklake-spark:1.0.0')
    .config('spark.sql.catalog.lake', 'io.ducklake.SparkCatalog')
    .config('spark.sql.catalog.lake.uri', 'postgres://...')
    .getOrCreate())

df = spark.sql("SELECT region, SUM(amount) FROM lake.sales GROUP BY region")
df.show()

Enter fullscreen mode Exit fullscreen mode

Caso D: queries analíticas desde Pandas (ad-hoc)

import duckdb

con = duckdb.connect()
con.execute("ATTACH 'ducklake:postgres://...' AS lake")

df = con.sql("SELECT * FROM lake.events WHERE ts > NOW() - INTERVAL 1 DAY").df()
# df es un DataFrame estándar de Pandas

Enter fullscreen mode Exit fullscreen mode

Casos de uso donde DuckLake brilla

Cargas con muchas escrituras pequeñas. Tablas de eventos donde cada producción de evento es una fila, sistemas de auditoría que registran cambios individuales, dashboards en tiempo real con upserts frecuentes.

Equipos que ya viven en SQL. Si el equipo tiene Postgres en producción gestionado por DBAs experimentados, agregar DuckLake encima reusa esa expertise. No hay que aprender Iceberg manifests, snapshots o compaction strategies.

Data engineering en el rango "no necesito Spark pero quiero ACID y time-travel". Equipos pequeños o medianos que tienen menos de 10 TB de datos pueden manejar todo el lakehouse con DuckDB local + Postgres como catálogo + R2/S3 para Parquet, sin necesidad de un cluster Spark, sin necesidad de Snowflake.

Multi-tenant SaaS con muchas tablas pequeñas. Cada tenant del SaaS es una tabla; el catálogo Postgres mantiene el listado, y el aislamiento es trivial. La proliferación de archivos en Iceberg con miles de tablas pequeñas es un problema operativo conocido; DuckLake lo elimina.

Casos de uso donde no es lo apropiado

Workloads de exclusivamente ingesta batch grande. Si tu pipeline es "una vez por hora ingesto 100 GB, después solo lecturas", Iceberg y Delta están bien optimizados y no hay ventaja material en migrar.

Ecosistemas Databricks / Snowflake con compromiso enterprise existente. Si la organización tiene contratos vigentes con Databricks o Snowflake, la integración nativa con Iceberg/Delta es probablemente más valiosa que la performance teórica de DuckLake.

Equipos sin DBA o expertise SQL operacional. Aunque DuckLake usa Postgres/SQLite, gestionar un Postgres en producción con backups, replicación y monitoreo es una habilidad real. Si el equipo no la tiene, los servicios manejados como Databricks pueden ser más razonables.

Lo que rompe en la 1.0

El PR #697 introdujo un breaking change que vale la pena conocer: adjuntar una versión más nueva de la extensión DuckLake ya no migra el catálogo automáticamente. La migración ahora es explícita, lo cual previene actualizaciones accidentales en producción pero exige un paso operativo adicional cuando se actualiza la extensión:

ALTER DUCKLAKE catalog UPGRADE;

Enter fullscreen mode Exit fullscreen mode

Esa es la única migración bloqueante respecto a 0.x. El resto del cambio es backward-compatible.

Roadmap: hacia dónde va DuckLake

El equipo publicó dos hitos próximos:

  • DuckLake v1.1 — Variant inlining cross-catalog, soporte para multi-deletion vector Puffin files, mejoras en data inlining para más tipos.
  • DuckLake v2.0Git-like branching para datasets (la feature más esperada por equipos de ML que necesitan experimentar sobre snapshots), role-based access control built-in en el catálogo, y mejoras en la primitiva de transacciones distribuidas.

El branching es particularmente interesante: permitirá crear una rama de un dataset, hacer cambios, validarlos contra otro pipeline, y mergear o descartar — el mismo modelo mental que devs ya tienen con Git, aplicado a millones de filas.

Posicionamiento estratégico: "cheating with a better design"

La frase que el equipo de DuckDB Labs usa para describir su enfoque es honesta. Mientras Iceberg y Delta Lake gastaron años construyendo sistemas distribuidos de metadata sobre object storage —resolviendo problemas duros de consistencia eventual, locks distribuidos y atomicidad sin servidor central—, DuckLake simplemente delega esos problemas a un RDBMS, donde llevan resueltos cuarenta años.

Es una decisión arquitectónica con tradeoffs reales: escalar verticalmente un Postgres es eventualmente un cuello de botella que un sistema basado en archivos no tiene. Pero para el 95% de los casos prácticos, donde una organización tiene menos de 1 PB de datos en un solo lakehouse y un Postgres bien configurado puede manejar millones de operaciones por segundo, la simplificación operacional es enorme.

Lección de fondo

Hay un patrón en la historia de la ingeniería de datos que vale la pena retener. Cada cinco o seis años aparece una propuesta que cuestiona una premisa que el campo daba por sentada. Hadoop cuestionó "los datos tienen que estar en una base de datos". Spark cuestionó "MapReduce es el único modelo de cómputo distribuido". Iceberg y Delta cuestionaron "los lakehouses no pueden tener ACID". DuckLake cuestiona "el catálogo de un lakehouse tiene que vivir en archivos".

La pregunta para quien evalúa estas tecnologías no es si la nueva propuesta es mejor en abstracto, sino si la premisa que cuestiona aplica a su caso real. Para muchos equipos, los problemas que Iceberg resolvió con archivos JSON en S3 nunca fueron problemas que ellos tuvieran. Para esos equipos, DuckLake representa una simplificación legítima. Para equipos al límite del scaling de Iceberg con cientos de millones de archivos, la conversación es distinta y los tradeoffs cambian.

Y para devs que están entrando al campo de data engineering en 2026: valdría más aprender DuckLake con un catálogo Postgres y datos en R2 que tratar de armar un cluster Spark + Iceberg + Hive Metastore desde cero. Es más cercano al stack que un equipo de tres a diez personas necesita, y el ecosistema Postgres es enormemente más maduro que cualquier sistema distribuido específico de lakehouse.

Fuentes