Saltar para o conteúdo principal
Versão Next 🚧

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.

Para saber mais

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

ComponenteVersão
Spark4.0.0
Iceberg (Spark runtime)1.10.0
Scala2.13

Instalação

Terminal input
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-key
  • secret-key
Terminal input
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"
Dica

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âmetroDescrição
enabledHabilitar ou desabilitar o CronJob
scheduleExpressao cron para agendamento
commandScript 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/worker
  • spark.commonLabels e spark.master.podLabels / spark.worker.podLabels aplicam 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âmetroDescriçãoPadrão
maintenance.spark.enabledHabilitar dependencia Sparktrue
maintenance.spark.image.repositoryImagem Sparkdocker.io/bitnamilegacy/spark
maintenance.spark.image.tagTag da imagem Spark4.0.0-debian-12-r0
maintenance.jobs.expireSnapshots.enabledHabilitar expire snapshotstrue
maintenance.jobs.expireSnapshots.scheduleCron do expire snapshots0 2 * * *
maintenance.jobs.removeOrphanFiles.enabledHabilitar remocao de orfaostrue
maintenance.jobs.removeOrphanFiles.scheduleCron da remocao de orfaos0 3 * * 0
maintenance.jobs.rewriteDataFiles.enabledHabilitar reescrita de arquivosfalse
maintenance.jobs.rewriteDataFiles.scheduleCron da reescrita0 4 * * 6

Desinstalacao

Terminal input
helm uninstall <release> -n <namespace>