Anatomía Interna de Apache Iceberg: Catalog Pointer, Metadata JSON, Manifest Lists y Concurrencia Optimista (55 min)
Anatomía Interna de Apache Iceberg: Catalog Pointer, Metadata JSON, Manifest Files y Concurrencia Optimista
1. Por qué Apache Hive Table Format Fracasó en Object Storage (S3 / GCS)
En tablas Hive clásicas, la fuente de verdad de qué archivos pertenecen a una partición es listar los directorios físicos en S3 (LISTObjectsV2):
- Es una operación costosa y lenta ($\mathcal{O}(N_{\text{directorios}})$ llamadas HTTP).
- Carece de atomicidad: si un job de Spark falla a mitad de escribir $200$ archivos Parquet, quedan archivos huérfanos visibles para los lectores concurrentes.
Apache Iceberg traslada el seguimiento al nivel de archivo individual mediante un árbol inmutable de tres capas gobernado por un puntero atómico Compare-and-Swap (CAS) en el Catálogo (REST Catalog / AWS Glue / Nessie / Polaris):
flowchart TD
CAT["Iceberg Catalog (Atomic CAS Pointer)"] --> META["Table Metadata File (v42.metadata.json)"]
META --> S1["Snapshot s_41 (Time Travel Histórico)"]
META --> S2["Snapshot Actual s_42 (Manifest List Avro)"]
S2 --> MF1["Manifest File 1 (Estadísticas Min/Max por Archivo)"]
S2 --> MF2["Manifest File 2 (Pruning de Particiones)"]
MF1 --> P1["Data File 001.parquet (Columnar)"]
MF1 --> P2["Position Delete File del_01.parquet"]
2. Poda de Archivos en Dos Fases (Two-Level Metadata Pruning) Sin Tocar Datos
1. Poda en Manifest List: Cada entrada en el Manifest List almacena el rango $[\min, \max]$ de las columnas de partición para un Manifest File entero, descartando miles de archivos en milisegundos.
2. Poda en Manifest File: Cada Manifest File (formato Avro) contiene los límites exactos lower_bounds y upper_bounds, conteo de nulos y conteo de filas por cada columna de cada archivo Parquet individual.