Configuração do Iceberg
O chart tdp-iceberg empacota jobs de manutencao para tabelas Apache Iceberg 1.10.0, utilizando Apache Spark como runtime.
O que é o Apache Iceberg e por que ele precisa de manutenção?
O Apache Iceberg é um formato de tabela aberta para grandes datasets, projetado para superar as limitações do Hive.
Assim como o Delta Lake, o Iceberg mantém snapshots — versões imutáveis da tabela a cada operação de escrita.
Isso permite leitura consistente, viagem no tempo (time travel) e operações ACID.
Com o uso contínuo, as tabelas Iceberg acumulam:
- Snapshots antigos: cada write cria um novo snapshot; os antigos precisam ser expirados para liberar espaço de metadados
- Arquivos órfãos: arquivos que foram criados mas nunca referenciados por um snapshot confirmado
- Arquivos pequenos: operações frequentes de escrita geram muitos arquivos pequenos que degradam a performance de leitura
O chart tdp-iceberg cria Kubernetes CronJobs que executam essas operações de manutenção de forma agendada, usando o Spark para processar as tabelas no armazenamento S3-compatível.
Consulte Apache Iceberg — Conceitos para uma visão completa do formato, snapshots e casos de uso.
Visão geral
Este chart fornece CronJobs para manutencao agendada de tabelas Iceberg:
- Expire snapshots -- remove snapshots antigos com base em politica de retencao
- Remove orphan files -- remove arquivos orfaos não rastreados pelos metadados
- Rewrite data files -- reescreve arquivos de dados para compactacao e otimizacao
O chart utiliza o chart upstream do Spark como dependencia para fornecer o runtime.
Compatibilidade
| Componente | Versão |
|---|---|
| Spark | 4.0.0 |
| Iceberg (Spark runtime) | 1.10.0 |
| Scala | 2.13 |
Instalação
helm upgrade --install <release> \
oci://registry.tecnisys.com.br/tdp/charts/tdp-iceberg \
-n <namespace> --create-namespace
Pre-requisitos
Secret de credenciais S3/MinIO
Os CronJobs de manutencao requerem um Secret chamado minio-credentials com as seguintes chaves:
access-keysecret-key
kubectl -n <namespace> create secret generic minio-credentials \
--from-literal=access-key='<ACCESS_KEY>' \
--from-literal=secret-key='<SECRET_KEY>'
Hive Metastore
Por padrão, o catalogo Iceberg e configurado para utilizar um Hive Metastore:
maintenance:
spark:
config:
"spark.sql.catalog.iceberg.type": "hive"
"spark.sql.catalog.iceberg.uri": "thrift://<metastore-service>.<namespace>.svc.cluster.local:9083"
O valor de exemplo típico é thrift://metastore.hive-metastore.svc.cluster.local:9083; ajuste host e namespace ao seu Hive Metastore.
Jobs de manutencao
Os jobs sao configurados sob maintenance.jobs.*:
Expire Snapshots
Remove snapshots antigos para liberar espaco de armazenamento:
maintenance:
jobs:
expireSnapshots:
enabled: true
schedule: "0 2 * * *" # Diariamente as 2h
command: |
# Script de expiracao de snapshots
spark-sql --conf ... -e "CALL iceberg.system.expire_snapshots(...)"
Remove Orphan Files
Remove arquivos orfaos que não sao mais rastreados pelos metadados do Iceberg:
maintenance:
jobs:
removeOrphanFiles:
enabled: true
schedule: "0 3 * * 0" # Semanalmente aos domingos as 3h
command: |
# Script de remocao de orfaos
spark-sql --conf ... -e "CALL iceberg.system.remove_orphan_files(...)"
Rewrite Data Files
Reescreve arquivos de dados para compactacao e otimizacao de performance:
maintenance:
jobs:
rewriteDataFiles:
enabled: false
schedule: "0 4 * * 6" # Sabados as 4h
command: |
# Script de reescrita de arquivos
spark-sql --conf ... -e "CALL iceberg.system.rewrite_data_files(...)"
Cada job suporta os seguintes parametros:
| Parâmetro | Descrição |
|---|---|
enabled | Habilitar ou desabilitar o CronJob |
schedule | Expressao cron para agendamento |
command | Script shell executado pelo container (executado verbatim) |
Configuração do Spark
Dependencia Spark (subchart)
O chart upstream do Spark e configurado sob as chaves de nivel superior spark.*:
spark.image.*controla a imagem Spark usada pelos Pods master/workerspark.commonLabelsespark.master.podLabels/spark.worker.podLabelsaplicam labels aos recursos
Imagem dos containers de manutencao
Os CronJobs utilizam maintenance.spark.image.* para a imagem dos containers:
maintenance:
spark:
enabled: true
image:
repository: "docker.io/bitnamilegacy/spark"
tag: "4.0.0-debian-12-r0"
Configuração do Spark
maintenance:
spark:
config:
"spark.sql.catalog.iceberg": "org.apache.iceberg.spark.SparkCatalog"
"spark.sql.catalog.iceberg.type": "hive"
"spark.sql.catalog.iceberg.uri": "thrift://<metastore-service>.<namespace>.svc.cluster.local:9083"
"spark.hadoop.fs.s3a.endpoint": "http://<s3-host>.<namespace>.svc.cluster.local:9000"
"spark.hadoop.fs.s3a.path.style.access": "true"
Parametros principais
| Parâmetro | Descrição | Padrão |
|---|---|---|
maintenance.spark.enabled | Habilitar dependencia Spark | true |
maintenance.spark.image.repository | Imagem Spark | docker.io/bitnamilegacy/spark |
maintenance.spark.image.tag | Tag da imagem Spark | 4.0.0-debian-12-r0 |
maintenance.jobs.expireSnapshots.enabled | Habilitar expire snapshots | true |
maintenance.jobs.expireSnapshots.schedule | Cron do expire snapshots | 0 2 * * * |
maintenance.jobs.removeOrphanFiles.enabled | Habilitar remocao de orfaos | true |
maintenance.jobs.removeOrphanFiles.schedule | Cron da remocao de orfaos | 0 3 * * 0 |
maintenance.jobs.rewriteDataFiles.enabled | Habilitar reescrita de arquivos | false |
maintenance.jobs.rewriteDataFiles.schedule | Cron da reescrita | 0 4 * * 6 |
Desinstalacao
helm uninstall <release> -n <namespace>