Configuração do Iceberg
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 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. Com o uso contínuo, isso tende a acumular:
- snapshots antigos;
- arquivos órfãos;
- arquivos pequenos que prejudicam a performance de leitura.
O chart tdp-iceberg cria CronJobs Kubernetes para executar essas rotinas de manutenção de forma agendada, usando Apache Spark como motor de processamento.
Consulte Apache Iceberg — Conceitos para uma visão completa do formato, snapshots e casos de uso.
Estrutura de valores (Helm)
O chart tdp-iceberg distribui a configuração em dois blocos principais:
maintenance:— habilita os jobs, define o Spark dos CronJobs, configurações Spark (catálogo, S3) e agendamentos de cada job.spark:— controla o subchart upstream Spark (pods master/worker). Independente da imagem usada pelos CronJobs.
maintenance:
enabled: true
spark:
enabled: true
image:
repository: "registry.tecnisys.com.br/tdp-dev/images/spark"
tag: "4.0.2-0"
jobs:
expireSnapshots:
enabled: true
spark:
image:
registry: registry.tecnisys.com.br
repository: tdp-dev/images/spark
tag: 4.0.2-0
Visão geral
| Propriedade | Valor |
|---|---|
| Chart | tdp-iceberg |
| Versão do Iceberg (runtime) | 1.10.0 |
| Versão do chart | 3.0.1 |
| Registry (OCI) | oci://registry.tecnisys.com.br/tdp/charts/tdp-iceberg |
| Tipo | maintenance — CronJobs Kubernetes |
| Exposição HTTP externa | Não se aplica |
Compatibilidade de runtime
| Componente | Versão |
|---|---|
| Spark | 4.0.2 |
| Iceberg (Spark runtime) | 1.10.0 |
| Scala | 2.13 |
O chart não substitui o catálogo nem o warehouse: ele agenda tarefas que atuam sobre tabelas Iceberg já existentes. Você continua responsável por garantir que os comandos nos CronJobs apontem para o catálogo, metastore e bucket corretos.
Páginas relacionadas
- Integrações — Iceberg: S3, Hive Metastore, configuração do catálogo Spark, Trino, Airflow.
- Segurança — Iceberg: Secret
s3-credentials, credenciais S3 e boas práticas.
Pré-requisitos
- Kubernetes 1.32+, Red Hat OpenShift 4.19+ ou Rancher Manager 2.10.x+
- Helm 3.2.0+
- Registry OCI da Tecnisys acessível pelo ambiente de instalação
- Secret
s3-credentialscriado no namespace antes do deploy (ver Segurança — Iceberg) - Endpoint S3/MinIO acessível a partir do cluster
- Hive Metastore acessível via Thrift, se o catálogo Iceberg usar
type: hive
Sem esses itens, os comandos Spark dos CronJobs falham ao resolver warehouse, credenciais ou metadados. Confirme que o metastore e o bucket referenciados nos valores apontam para o catálogo real das tabelas a serem mantidas.
- Instalação
- Parâmetros principais
- Detalhes de configuração
- Desinstalação
Instalação
helm upgrade --install <RELEASE_NAME> \
oci://registry.tecnisys.com.br/tdp/charts/tdp-iceberg \
--version <CHART_VERSION> \
-n <NAMESPACE> --create-namespace
| Placeholder | Descrição |
|---|---|
<RELEASE_NAME> | Nome do release Helm |
<NAMESPACE> | Namespace Kubernetes de instalação |
<CHART_VERSION> | Versão do chart |
OpenShift
O chart configura adaptSecurityContext: force por padrão, adequando os contextos de segurança aos requisitos do OpenShift automaticamente. Nenhum parâmetro adicional é necessário para a maioria dos ambientes OpenShift.
global:
compatibility:
openshift:
adaptSecurityContext: force
Verificar instalação
kubectl -n <NAMESPACE> get cronjobs
kubectl -n <NAMESPACE> get jobs
kubectl -n <NAMESPACE> logs job/<JOB_NAME>
Parâmetros principais
| Parâmetro | Descrição | Padrão |
|---|---|---|
maintenance.enabled | Habilitar jobs de manutenção | true |
maintenance.spark.enabled | Habilitar dependência Spark | true |
maintenance.spark.image.repository | Imagem dos CronJobs | registry.tecnisys.com.br/tdp-dev/images/spark |
maintenance.spark.image.tag | Tag da imagem dos CronJobs | 4.0.2-0 |
maintenance.spark.resources.requests.cpu | CPU request dos jobs | 1 |
maintenance.spark.resources.requests.memory | Memória request dos jobs | 2Gi |
maintenance.spark.resources.limits.cpu | CPU limit dos jobs | 2 |
maintenance.spark.resources.limits.memory | Memória limit dos jobs | 4Gi |
maintenance.jobs.expireSnapshots.enabled | Habilitar expire snapshots | true |
maintenance.jobs.expireSnapshots.schedule | Cron do expire snapshots | 0 2 * * * |
maintenance.jobs.expireSnapshots.retentionDays | Dias de retenção | 7 |
maintenance.jobs.removeOrphanFiles.enabled | Habilitar remoção de órfãos | true |
maintenance.jobs.removeOrphanFiles.schedule | Cron do remove orphan files | 0 3 * * 0 |
maintenance.jobs.removeOrphanFiles.olderThanDays | Idade mínima dos órfãos | 3 |
maintenance.jobs.rewriteDataFiles.enabled | Habilitar reescrita de dados | false |
maintenance.jobs.rewriteDataFiles.schedule | Cron do rewrite data files | 0 1 * * 6 |
global.compatibility.openshift.adaptSecurityContext | Compatibilidade OpenShift | force |
Jobs de manutenção
Cada job vira um CronJob no Kubernetes: horário, política de retenção e o comando Spark são declarados no values. Monitore execuções bem-sucedidas, duração e consumo de cluster — jobs longos podem competir com outras cargas Spark.
Os jobs são configurados sob maintenance.jobs.*.
Os exemplos abaixo mostram o formato esperado do comando. Ajuste catálogo, endpoint, warehouse, tabela e janelas de retenção conforme o seu ambiente.
Expire Snapshots
Remove snapshots antigos para liberar espaço de armazenamento e de metadados:
maintenance:
jobs:
expireSnapshots:
enabled: true
schedule: "0 2 * * *"
retentionDays: 7
command: |
spark-sql \
--packages org.apache.iceberg:iceberg-spark-runtime-4.0_2.13:1.10.0,org.apache.hadoop:hadoop-aws:3.3.4 \
--conf spark.sql.catalog.iceberg=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.iceberg.type=hive \
--conf spark.sql.catalog.iceberg.uri=thrift://metastore.hive-metastore.svc.cluster.local:9083 \
--conf spark.sql.catalog.iceberg.warehouse=s3a://warehouse/hive \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
-e "CALL iceberg.system.expire_snapshots(older_than => TIMESTAMP '$(date -d '7 days ago' '+%Y-%m-%d %H:%M:%S')');"
Remove Orphan Files
Remove arquivos órfãos que deixaram de ser referenciados por snapshots válidos:
maintenance:
jobs:
removeOrphanFiles:
enabled: true
schedule: "0 3 * * 0"
olderThanDays: 3
command: |
spark-sql \
--packages org.apache.iceberg:iceberg-spark-runtime-4.0_2.13:1.10.0,org.apache.hadoop:hadoop-aws:3.3.4 \
--conf spark.sql.catalog.iceberg=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.iceberg.type=hive \
--conf spark.sql.catalog.iceberg.uri=thrift://metastore.hive-metastore.svc.cluster.local:9083 \
--conf spark.sql.catalog.iceberg.warehouse=s3a://warehouse/hive \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
-e "CALL iceberg.system.remove_orphan_files(older_than => TIMESTAMP '$(date -d '3 days ago' '+%Y-%m-%d %H:%M:%S')');"
Rewrite Data Files
Reescreve e compacta arquivos de dados para melhorar a performance de leitura. Fica desabilitado por padrão por ser mais intensivo em recursos.
Ao habilitar, você aceita jobs que leem e gravam dados em volume — maior uso de CPU, memória e I/O no storage, e janela de execução possivelmente longa em tabelas grandes. Ative quando houver degradação de consultas por fragmentação de arquivos, após ingestões muito granulares ou quando a política de manutenção previr compactação periódica.
maintenance:
jobs:
rewriteDataFiles:
enabled: false
schedule: "0 1 * * 6"
command: |
spark-sql \
--packages org.apache.iceberg:iceberg-spark-runtime-4.0_2.13:1.10.0,org.apache.hadoop:hadoop-aws:3.3.4 \
--conf spark.sql.catalog.iceberg=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.iceberg.type=hive \
--conf spark.sql.catalog.iceberg.uri=thrift://metastore.hive-metastore.svc.cluster.local:9083 \
--conf spark.sql.catalog.iceberg.warehouse=s3a://warehouse/hive \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
-e "CALL iceberg.system.rewrite_data_files(table => 'iceberg.default.<TABLE_NAME>');"
Parâmetros dos jobs
| Parâmetro | Descrição |
|---|---|
enabled | Habilitar ou desabilitar o CronJob |
schedule | Expressão cron |
retentionDays | Dias de retenção para expireSnapshots |
olderThanDays | Idade mínima para removeOrphanFiles |
command | Script shell executado pelo container |
Configuração do Spark
Este chart usa dois contextos de imagem distintos para o Spark — não os confunda:
| Chave | O que controla | Formato |
|---|---|---|
spark.image.* | Pods master/worker do subchart Spark | registry + repository separados |
maintenance.spark.image.* | Containers dos CronJobs de manutenção | repository com URL completa |
Atualizar uma não atualiza a outra — ao fazer upgrade do Spark, alinhe também a tag em maintenance.spark.image para evitar incompatibilidade.
Subchart Spark (master/worker)
spark:
image:
registry: registry.tecnisys.com.br
repository: tdp-dev/images/spark
tag: 4.0.2-0
pullPolicy: IfNotPresent
Imagem dos containers de manutenção
maintenance:
spark:
enabled: true
image:
repository: "registry.tecnisys.com.br/tdp-dev/images/spark"
tag: "4.0.2-0"
pullPolicy: IfNotPresent
Estas duas configurações são independentes. Alterar spark.image.* não altera a imagem usada pelos CronJobs de manutenção.
Integrações
Para S3/MinIO, Hive Metastore, configuração do catálogo e uso a partir de Spark, Airflow ou Trino, consulte Integrações — Iceberg.
Desinstalação
helm uninstall <RELEASE_NAME> -n <NAMESPACE>
O chart tdp-iceberg é do tipo maintenance e não cria PVCs. A desinstalação remove apenas os CronJobs, Jobs, ServiceAccount, RBAC e demais recursos do release — sem risco de perda de dados nos buckets S3/Ozone.