Pular para o conteúdo
Data Engineering 10 min read

Apache Iceberg: O Formato de Tabela que Está Transformando o Big Data

Conheça o Apache Iceberg, o formato de tabela aberto que está se tornando padrão para Data Lakehouses, com suporte a ACID, time travel e muito mais.

Por Equipe Integr8 07/01/2025

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.

💡Adoção em Larga Escala

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:

Estrutura hierárquica de metadados do Catalog até os Data Files
100%
Arquitetura Apache Iceberg

Estrutura hierárquica de metadados do Catalog até os Data Files

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';
Hidden Partitioning

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

AspectoIcebergDelta LakeHudi
ACID
Multi-engine✅ Excelente⚠️ Spark-centric⚠️ Limitado
Partition Evolution✅ Nativo
Hidden Partitioning
Row-level deletes✅ Eficiente
Streaming✅ Melhor
CommunityApacheDatabricksApache

Quando Usar Iceberg

    ⚠️Considerações

    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.