Configuração do Spark
O que é o Apache Spark no TDP?
O Apache Spark é o motor de processamento de dados em larga escala do TDP.
Enquanto o Trino é otimizado para consultas SQL interativas, o Spark é otimizado para transformações de dados em batch e pipelines ETL — processar volumes massivos de dados, aplicar transformações complexas, e gravar o resultado de volta no storage.
No TDP Kubernetes, o Spark é usado de duas formas principais:
- Através do Airflow: pipelines agendados que processam dados com SparkSubmitOperator
- Através do JupyterHub: análises interativas em notebooks que conectam ao cluster Spark
Consulte Apache Spark — Conceitos para uma visão completa da ferramenta, sua arquitetura e funcionamento.
Arquitetura master-worker
O Spark no TDP usa a arquitetura standalone (master + workers):
| Componente | Função |
|---|---|
| Master | Gerencia o cluster, aceita aplicações e distribui trabalho |
| Workers | Executam os executors das aplicações Spark |
| History Server | Interface web para visualizar o histórico de execuções |
O driver da aplicação Spark (quem envia o job) pode ser o Airflow, um notebook Jupyter, ou qualquer cliente que aponte para spark://<master>:7077.
Catálogos e formatos de tabela
O chart tdp-spark suporta blocos opcionais para Delta Lake e Iceberg — os dois formatos de tabela aberta do TDP.
Habilitar esses blocos (deltaLake.enabled, iceberg.enabled) configura as propriedades Spark necessárias para ler e escrever nesses formatos, usando o Hive Metastore como catálogo de tabelas.
Esta página descreve a configuração do Apache Spark no TDP Kubernetes. O chart tdp-spark empacota um chart upstream do Spark e adiciona configuração e integrações específicas da plataforma (Jupyter, Airflow, blocos opcionais Delta Lake e Iceberg).
Visão Geral
| Propriedade | Valor |
|---|---|
| Chart | tdp-spark |
| Versão do Spark | 4.0.0 |
| Versão do Chart | 3.0.0 |
| Registry (exemplos) | oci://registry.tecnisys.com.br/tdp/charts/tdp-spark |
Parâmetros principais (chart)
| Parâmetro | Descrição | Padrão típico |
|---|---|---|
spark.enabled | Habilitar o Spark | true |
spark.image.repository / spark.image.tag | Imagem do Spark | Ver values.yaml do chart |
spark.master.resources | Recursos do master | Ver values.yaml |
spark.worker.replicaCount | Workers | 2 |
spark.worker.autoscaling.enabled | HPA nos workers | false |
spark.historyServer.enabled | History Server | true |
spark.sparkConf | Mapa de configuração Spark | Ver values.yaml |
hadoopConfig | Valores para core-site.xml renderizados pelo chart | Ver values.yaml |
customSparkConfig.properties | Conteúdo de spark-defaults.conf | Ver values.yaml |
integration.jupyter.enabled | Bloco de integração Jupyter | true |
integration.airflow.enabled | Bloco de integração Airflow | false |
deltaLake.enabled | Bloco opcional Delta Lake | false |
iceberg.enabled | Bloco opcional Iceberg | false |
O chart usa um bloco serviceAccount na raiz e spark.serviceAccount para a dependência upstream; ambos estão no values.yaml.
Instalação
Use o registry OCI da sua organização e substitua <release> e <namespace>:
helm install <release> oci://registry.tecnisys.com.br/tdp/charts/tdp-spark \
-n <namespace> --create-namespace
Ajuste recursos e réplicas via seu arquivo de values ou --set, conforme a necessidade do ambiente (desenvolvimento costuma usar menos CPU/memória que produção).
Configuração do Spark (sparkConf e arquivos)
Executor e driver (exemplo)
spark:
sparkConf:
"spark.executor.instances": "2"
"spark.executor.cores": "2"
"spark.executor.memory": "4g"
"spark.driver.memory": "2g"
"spark.driver.cores": "1"
Event log (exemplo local)
spark:
sparkConf:
"spark.eventLog.enabled": "true"
"spark.eventLog.dir": "file:///tmp/spark-events"
"spark.history.fs.logDirectory": "file:///tmp/spark-events"
Object storage (S3/S3A)
Credenciais e endpoints devem ser fornecidos pelo cliente (Secrets, values injetados por CI/CD, etc.). O chart aceita propriedades em:
spark.sparkConf(por exemplospark.hadoop.fs.s3a.*)hadoopConfig(por exemplofs.s3a.*)customSparkConfig.properties
Exemplo com placeholders:
spark:
sparkConf:
"spark.hadoop.fs.s3a.endpoint": "https://<s3-endpoint>"
"spark.hadoop.fs.s3a.path.style.access": "true"
"spark.hadoop.fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem"
"spark.hadoop.fs.defaultFS": "s3a://<bucket-warehouse>"
Delta Lake e Iceberg
Os blocos deltaLake e iceberg no values.yaml são opcionais. Habilitá-los não aplica sozinho todas as propriedades Spark necessárias: use customSparkConfig.properties e spark.sparkConf para dependências e parâmetros exigidos pela sua versão do Spark e dos conectores.
Exemplo ilustrativo (Delta — ajuste pacotes/versões à sua imagem):
spark:
sparkConf:
"spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog"
"spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension"
"spark.sql.warehouse.dir": "s3a://<bucket>/delta"
Exemplo ilustrativo (Iceberg com metastore Hive — substitua URI e warehouse):
spark:
sparkConf:
"spark.sql.catalog.iceberg": "org.apache.iceberg.spark.SparkCatalog"
"spark.sql.catalog.iceberg.type": "hive"
"spark.sql.catalog.iceberg.uri": "thrift://<hive-metastore-host>:9083"
"spark.sql.catalog.iceberg.warehouse": "s3a://<bucket>/hive"
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
Horizontal Pod Autoscaling (workers)
spark:
worker:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPU: 70
targetMemory: 80
O HPA exige Metrics Server no cluster.
Integrações (Jupyter e Airflow)
O chart renderiza ConfigMaps com configuração para outros componentes:
integration.jupyter.sparkConfig→ defaults para ambientes Jupyterintegration.airflow.sparkConfig→ defaults para clientes Spark no Airflow
Use o hostname e porta reais do master Spark no seu namespace (descubra com kubectl get svc -n <namespace>). Exemplo genérico:
integration:
jupyter:
enabled: true
sparkConfig:
"spark.master": "spark://<spark-master-service>.<namespace>.svc.cluster.local:7077"
airflow:
enabled: true
sparkConfig:
"spark.master": "spark://<spark-master-service>.<namespace>.svc.cluster.local:7077"
"spark.driver.memory": "1g"
"spark.executor.memory": "2g"
"spark.executor.cores": "1"
Habilitar apenas a integração Jupyter:
helm upgrade --install <release> oci://registry.tecnisys.com.br/tdp/charts/tdp-spark \
-n <namespace> \
--set integration.jupyter.enabled=true
Acesso e troubleshooting
kubectl -n <namespace> get svc -l app.kubernetes.io/instance=<release>
kubectl -n <namespace> get pods
kubectl -n <namespace> get events --sort-by=.lastTimestamp
Desinstalação
helm uninstall <release> -n <namespace>
Para a lista completa de parâmetros, consulte o values.yaml do chart.