Buenas prácticas
Cierra el recorrido sobre local.analytics.events: diseño, writes, catálogo, mantenimiento y compatibilidad. Iceberg es el formato; el motor y el catálogo son tuyos.
Documentación: docs, spec, procedures, multi-engine.
Diseño
- Esquema con IDs: evolve con
ALTER(ADD/RENAME/DROP/TYPE). No reutilices IDs ni simules un rename con drop+add. - Partition transforms (
days(event_time),identity,bucket) alineados al filtro real. No sobreparticiones por ids únicos. - Evolucionar el spec no reescribe el histórico. Compáctalo aparte si el layout viejo duele.
format-versionmínima que cubra tus deletes/motores. v1–v3 adoptadas; v4 no. No actives v3 “por las features del blog” si Trino/Flink aún no las leen.
Escrituras
- Controla el tamaño de fichero (
write.target-file-size-bytes, distribuciónhash/range, no un append de 40 filas cada segundo sin compactar). writeTo(...).append()para tablas de catálogo. Reservaformat("iceberg")para casos path aislados.INSERT OVERWRITEcon alcance consciente (dynamic vs static).MERGEreescribe ficheros afectados: predica bien y deduplica el source.- SQL
MERGE/UPDATE/DELETEnecesitan extensions en Spark 3.x. DataFramemergeIntoes Spark 4.0+.
Catálogo
- Elige según cuántos motores y writers: Hadoop para un solo proceso de laboratorio; REST (u Hive/JDBC bien operados) cuando hay que commitear en serio.
- Catálogo ≠ S3. Alta disponibilidad y backups del metastore/REST, no solo del warehouse.
- Cloud catalogs (Glue, etc.) son implementaciones, no el estándar Iceberg.
Mantenimiento
rewrite_data_files(binpack; sort/z-order solo medidos).rewrite_manifestssi el planning se ahoga en manifests chicos.expire_snapshotscon retención que cubra time travel y jobs largos; respeta branches/tags.remove_orphan_filescondry_runyolder_thanholgado. Nunca en medio de un write.- Observa
.snapshots,.files,.manifests: recuento de snapshots, ficheros por partición, manifests.
Compatibilidad
- Antes de subir format-version o table features, verifica cada motor que lee/escribe.
- “Funciona en Spark” ≠ mismo
MERGE, mismos deletes, mismos types en Flink/Trino. - No documentes spec v4 como estable.
Observabilidad
- Crecimiento de
metadata/y de manifests. - Small files tras streaming.
- Fallos de commit / retries (conflicto OCC).
- Time travel que de repente falla: alguien expiró el snapshot.
Recovery
- Snapshot + tag ayudan a inspeccionar y revertir (
rollback_to_snapshot) dentro de la retención. - No sustituyen copiar el warehouse y el catálogo a otro sitio.
- No parchees metadata JSON a mano.
Recorrido
text
tabla events
→ snapshots / manifests
→ days(event_time)
→ IDs y ALTER
→ Spark writeTo / SQL
→ catálogo (puntero)
→ rewrite / expire / orphans
→ operaciónSpark enseñó las APIs; Iceberg sigue siendo el formato.
