O que é Apache Iceberg?
Apache Iceberg é um formato de tabela aberto e de alto desempenho para datasets analíticos massivos. Criado pela Netflix e doado à Apache Foundation, o Iceberg resolve problemas fundamentais de Data Lakes tradicionais.
Iceberg é usado em produção por Netflix, Apple, LinkedIn, Airbnb, Expedia e centenas de outras empresas processando petabytes de dados diariamente.
Por que Iceberg?
Transações ACID
Commits atômicos, isolamento de leitura/escrita, consistência garantida
Time Travel
Consulte qualquer versão histórica dos dados instantaneamente
Schema Evolution
Adicione, remova ou renomeie colunas sem reescrever dados
Hidden Partitioning
Particionamento transparente sem colunas extras nas queries
Multi-Engine
Funciona com Spark, Trino, Flink, Dremio, Athena e mais
Escalabilidade
Suporta tabelas com milhões de arquivos sem degradação
Arquitetura do Iceberg
O Iceberg organiza metadados em uma estrutura hierárquica:
Features Essenciais
1. Time Travel
-- Consultar dados de um snapshot específico
SELECT * FROM my_table FOR VERSION AS OF 12345678901234;
-- Consultar dados de um timestamp específico
SELECT * FROM my_table FOR TIMESTAMP AS OF '2025-01-01 10:00:00';
-- Ver histórico de snapshots
SELECT * FROM my_table.history;
-- Rollback para versão anterior
CALL system.rollback_to_snapshot('my_table', 12345678901234);
2. Schema Evolution
-- Adicionar coluna (sem reescrever dados!)
ALTER TABLE my_table ADD COLUMN new_column STRING;
-- Renomear coluna
ALTER TABLE my_table RENAME COLUMN old_name TO new_name;
-- Alterar tipo (quando compatível)
ALTER TABLE my_table ALTER COLUMN my_col TYPE BIGINT;
-- Reordenar colunas
ALTER TABLE my_table ALTER COLUMN col_a AFTER col_b;
3. Partition Evolution
Uma das features mais poderosas do Iceberg:
-- Criar tabela com particionamento por dia
CREATE TABLE events (
event_id STRING,
event_timestamp TIMESTAMP,
user_id STRING,
event_type STRING
) USING iceberg
PARTITIONED BY (days(event_timestamp));
-- Evoluir para particionamento por hora (sem migração!)
ALTER TABLE events ADD PARTITION FIELD hours(event_timestamp);
-- Queries funcionam transparentemente em ambos os esquemas
SELECT * FROM events
WHERE event_timestamp BETWEEN '2025-01-01' AND '2025-01-02';
Usuários não precisam saber como a tabela está particionada. O Iceberg automaticamente filtra partições baseado nos predicados da query.
4. Merge-on-Read (Row-Level Deletes)
-- Delete eficiente sem reescrever arquivos inteiros
DELETE FROM my_table WHERE user_id = 'user123';
-- Upsert com MERGE
MERGE INTO target_table t
USING source_table s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
Otimizações de Performance
Compaction
-- Compactar arquivos pequenos em arquivos maiores
CALL system.rewrite_data_files(
table => 'my_table',
options => map('target-file-size-bytes', '134217728')
);
Z-Ordering (Clustering)
-- Ordenar dados para melhorar data skipping
CALL system.rewrite_data_files(
table => 'my_table',
strategy => 'sort',
sort_order => 'user_id ASC NULLS LAST, event_timestamp DESC'
);
Expire Snapshots
-- Limpar snapshots antigos para economizar storage
CALL system.expire_snapshots(
table => 'my_table',
older_than => TIMESTAMP '2024-12-01 00:00:00',
retain_last => 5
);
Integrações com Query Engines
Apache Spark
# Configuração do SparkSession com Iceberg
spark = SparkSession.builder \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.catalog.my_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.my_catalog.type", "hadoop") \
.config("spark.sql.catalog.my_catalog.warehouse", "s3://my-bucket/warehouse") \
.getOrCreate()
# Query usando o catalog
df = spark.table("my_catalog.db.my_table")
Trino
-- Configurar connector no Trino
-- catalog/iceberg.properties:
-- connector.name=iceberg
-- hive.metastore.uri=thrift://metastore:9083
-- iceberg.catalog.type=hive_metastore
SELECT * FROM iceberg.my_schema.my_table;
Amazon Athena
-- Athena suporta Iceberg nativamente
CREATE TABLE my_iceberg_table (
id STRING,
name STRING,
created_at TIMESTAMP
)
LOCATION 's3://my-bucket/tables/my_table/'
TBLPROPERTIES ('table_type' = 'ICEBERG');
Comparativo: Iceberg vs Delta Lake vs Hudi
| Aspecto | Iceberg | Delta Lake | Hudi |
|---|---|---|---|
| ACID | ✅ | ✅ | ✅ |
| Multi-engine | ✅ Excelente | ⚠️ Spark-centric | ⚠️ Limitado |
| Partition Evolution | ✅ Nativo | ❌ | ❌ |
| Hidden Partitioning | ✅ | ❌ | ❌ |
| Row-level deletes | ✅ Eficiente | ✅ | ✅ |
| Streaming | ✅ | ✅ | ✅ Melhor |
| Community | Apache | Databricks | Apache |
Quando Usar Iceberg
Se você está 100% no ecossistema Databricks, Delta Lake pode ser mais simples. Para streaming-first, Apache Hudi pode ser melhor. Iceberg brilha em cenários multi-engine e governança.
Quer implementar Apache Iceberg no seu Data Lake? Entre em contato com nossos especialistas.