Configuração do Hive Metastore
O chart tdp-hive-metastore empacota o Apache Hive Metastore 4.0.0 para Kubernetes.
O que é o Hive Metastore e por que ele existe?
O Apache Hive Metastore é o serviço de catálogo de metadados do TDP.
Ele responde a uma pergunta fundamental: quando o Spark ou o Trino querem ler uma tabela chamada vendas, como eles sabem onde os arquivos dessa tabela estão no S3?
Qual é o esquema (colunas e tipos)? Quais partições existem?
O Hive Metastore guarda exatamente essas informações: o mapeamento entre nomes de tabelas e localizações físicas no armazenamento de objetos (S3/Ozone).
Sem ele, o Spark e o Trino não conseguem descobrir tabelas pelo nome — teriam que saber o caminho exato de cada arquivo.
Consulte Apache Hive — Conceitos para uma visão completa da ferramenta e seu papel no ecossistema de dados.
Como o Hive Metastore se encaixa no TDP
Spark / Trino
│
│ "Onde está a tabela 'vendas'?"
▼
Hive Metastore ──► PostgreSQL (armazena metadados)
│
│ "Está em s3a://warehouse/vendas/"
▼
Apache Ozone / S3 (onde os dados de fato estão)
O Hive Metastore é um serviço de infraestrutura, não uma interface para o usuário final.
Você raramente interage com ele diretamente — ele opera em segundo plano para que o Spark e o Trino funcionem corretamente com tabelas no formato Hive, Iceberg e Delta Lake.
Componentes implantados
| Componente | Descrição |
|---|---|
| Metastore Server | Serviço Thrift na porta 9083 que responde a consultas de metadados |
| PostgreSQL (interno ou externo) | Banco que armazena esquemas, tabelas, partições e localizações |
Pré-requisitos
- Kubernetes e Helm compatíveis com o chart
- Se usar PostgreSQL externo: instância acessível a partir do cluster
Instalação (OCI)
helm upgrade --install <release> oci://registry.tecnisys.com.br/tdp/charts/tdp-hive-metastore \
-n <namespace> --create-namespace
Requisitos de PostgreSQL
O Hive Metastore depende de capacidade suficiente de conexões no PostgreSQL:
| Requisito | Mínimo | Recomendado | Exemplo (TDP PostgreSQL) |
|---|---|---|---|
| max_connections | 300 | 400+ | 400 |
Se usar PostgreSQL externo, garanta limites e rede adequados; o chart TDP PostgreSQL documenta max_connections = 400 como exemplo de postgresql.conf.
O Hive Metastore precisa de um base de dados relacional para armazenar os metadados das tabelas (esquemas, localizações, partições).
O chart suporta banco embutido ou externo — para entender quando usar cada um, consulte PostgreSQL interno versus externo na Configuração Geral.
Banco interno (PostgreSQL embutido)
tdp-hive-metastore:
postgres:
enabled: true
internal:
image: "postgres:15"
pvcSize: 1Gi
maxConnections: 500
sharedBuffers: 512MB
effectiveCacheSize: 1.2GB
maintenanceWorkMem: 128MB
workMem: 32MB
walBuffers: 16MB
database: hive
username: hive
password: "<POSTGRES_PASSWORD>"
Banco externo
Defina tdp-hive-metastore.postgres.enabled=false e configure tdp-hive-metastore.postgres.external.*.
tdp-hive-metastore:
postgres:
enabled: false
external:
host: "<POSTGRESQL_HOST>"
port: 5432
TDPConfigurations:
externalDatabase:
enabled: true
recreate: false
externalSecret:
releaseName: "<postgresql-release>"
Os jobs de hook reutilizam TDPConfigurations.externalDatabase: autenticam no PostgreSQL upstream usando o Secret associado ao nome em externalSecret.releaseName (chave postgres-password, no padrão TDP).
- Use
recreate=trueapenas quando quiser recriar banco/usuário Hive de forma explícita; para upgrades que preservem dados, mantenharecreate=false(valor recomendado por omissão).
Sobrescritas via CLI (exemplo):
helm upgrade --install <release> oci://registry.tecnisys.com.br/tdp/charts/tdp-hive-metastore \
-n <namespace> --create-namespace \
--set TDPConfigurations.externalDatabase.recreate=false \
--set TDPConfigurations.externalDatabase.externalSecret.releaseName=<postgresql-release>
Parâmetros principais
| Parâmetro | Descrição | Valor por omissão / exemplo |
|---|---|---|
namespace | Namespace do deploy | Conforme o release Helm |
postgres.enabled | PostgreSQL interno | true |
postgres.external.host | Host PostgreSQL externo | Exemplo DNS de serviço |
metastore.type | Tipo de metastore (file ou s3) | file |
Recursos do Metastore
Valores típicos de referência: memória 1Gi request / 2Gi limit, CPU 500m request / 1000m limit, volume persistente configurável (confirme com helm show values).
Verificar instalação
kubectl -n <namespace> get all
Espera-se Deployment/Service do metastore (e do PostgreSQL interno, se postgres.enabled=true), com nomes derivados de <release>.
Override do Service (hive-service-override.yaml)
Em relação ao chart upstream, o Deployment rotula pods com app: {{ .Release.Name }}-metastore, enquanto o Service upstream pode usar seletor fixo incompatível. O template do chart TDP alinha o seletor para que o Service tenha endpoints.
Verificação:
kubectl get endpoints -n <namespace> <release>-metastore
Se aparecer <none>, o seletor não corresponde aos labels dos pods.
Teste local:
kubectl port-forward -n <namespace> svc/<release>-metastore 9083:9083
Credenciais do banco Hive (opcional)
HIVE_PASSWORD=$(kubectl get secret --namespace <namespace> \
<release>-hive-database -o jsonpath="{.data.password}" | base64 -d)
kubectl run postgres-client --rm --tty -i --restart='Never' \
--namespace <namespace> --image postgres:14 \
--env="PGPASSWORD=$HIVE_PASSWORD" \
--command -- psql -h <postgres-service> -p 5432 -U hive -d hive
Substitua <postgres-service> pelo hostname do PostgreSQL que o metastore utiliza (interno ou externo).
Solução de problemas
- Esgotamento de pool de conexões:
max_connections≥ 300 no PostgreSQL. - Autenticação: secrets e montagens corretas.
- Storage: permissões do PV.
- Rede: serviço PostgreSQL alcançável.
Comandos úteis (adaptando nomes de release/pod):
kubectl -n <namespace> exec <postgresql-pod> -- psql -c "SHOW max_connections;"
kubectl -n <namespace> exec <postgresql-pod> -- psql -c "SELECT count(*) FROM pg_stat_activity;"
kubectl -n <namespace> logs deployment/<release>-metastore