Run dbt Core on Spark (Kubernetes)
This guide explains how to set up dbt Core avec Apache Spark running on a Kubernetes cluster. Using Ilum as the execution engine, you can run scalable data transformation pipelines directly on your data lake.
You have two primary ways to connect dbt to Spark on Ilum:
Thrift Server vs. Spark Connect
| Caractéristique | Method 1: Spark Thrift Server (Legacy) | Method 2: Spark Connect (Modern) |
|---|---|---|
| Protocol | JDBC/ODBC (via HiveDriver) | gRPC (via Spark Connect) |
| Connection Type | Méthode : Thrift | Méthode : Séance |
| Architecture | Requires a dedicated Thrift Server pod | Connects directly to Spark Driver |
| Performance | Higher latency (row-based serialization) | High performance (Arrow-based) |
| Best For | BI Tools (Tableau, PowerBI), Legacy apps | Data Engineering, Python/dbt pipelines |
For a deep dive into the architecture, check out our Spark Connect on Kubernetes Guide.
Conditions préalables
Before starting, ensure your development environment is ready:
- Kubernetes Cluster: You need a running K8s cluster (GKE, EKS, AKS, or Minikube).
- Tools:
- Barre (for deploying Ilum).
- kubectl (configured to access your cluster).
- Python 3.8+ (for running dbt Core).
- Knowledge: Basic understanding of dbt projects and Spark concepts.
How to Configure dbt with Spark on Kubernetes
Choose your preferred connection method:
- Method 1: Thrift Server
- Method 2: Spark Connect
Step 1: Deploy Spark Thrift Server
Deploy Ilum with the SQL module (acting as a scalable Thrift server) and Hive Metastore enabled:
helm repo ajouter ilum https://charts.ilum.cloud
helm install ilum ilum/ilum \
--poser ilum-hive-metastore.enabled=vrai \
--poser ilum-core.metastore.enabled=vrai \
--poser ilum-core.metastore.type=ruche \
--poser ilum-sql.enabled=vrai \
--poser ilum-core.sql.enabled=vrai
Step 2: Connect to the Thrift Service
1. Identify the service:
kubectl get service
Recherchez le service dont le nom contient « sql-thrift-binary ».
2. Port-forward:
kubectl port-forward svc/ilum-sql-thrift-binary 10009:10009
Cela rend le serveur Thrift disponible à l’adresse localhost :10009.
3. Test with Beeline (optional):
beeline -u "jdbc:hive2://localhost:10009/default"
Courir:
MONTRER TABLES;
Attendez-vous à une liste vide ou à des tables existantes.
Configuring and Running dbt
1. Clean Environment (if needed):
pip uninstall dbt-spark pyspark -y
2. Install dbt and dependencies:
pip install Pyspark==3.5.8
pip install dbt-core
pip install "dbt-spark[PyHive,session]"
pip install --upgrade épargne
3. Verify installation:
dbt --version
Create dbt Project
1. Initialize a dbt project:
dbt init ilum_dbt_project
2. Answer the setup prompts:
Which database? 1 (étincelle)
host: localhost
Desired authentication method: 3 (épargne)
port: 10009
schema: default
threads: 1
This creates the ilum_dbt_project directory and a profiles.yml file in ~/.dbt/.
Configure dbt for Ilum
Éditer ~/.dbt/profiles.yml to include both Thrift and Spark Connect targets:
ilum_dbt_project:
cible: épargne # Default target
Sorties:
épargne:
type: étincelle
méthode: épargne
hôte: localhost
port: 10009
schéma: faire défaut
bobine: 1
connect_retries: 5
connect_timeout: 60
connect_args:
URL: "jdbc :hive2 ://localhost :10009/default ; transportMode=binaire ; hive.server2.transport.mode=binaire"
chauffeur: « org.apache.hive.jdbc.HiveDriver »
Auth: « AUCUN »
spark_connect:
type: étincelle
méthode: session
hôte: localhost
port: 15002
schéma: faire défaut
bobine: 1
Switch between targets:
# Use Thrift (default)
dbt run
# Use Spark Connect
dbt run --target spark_connect
# Or set default in dbt_project.yml
# target: spark_connect
-
Tester la connexion :
Debug dbtcd ilum_dbt_project
débogage dbtAssurez-vous qu’aucune erreur n’apparaît, indiquant que la connexion au serveur Thrift a réussi.
Create a Model to Write Data
-
Créer un modèle :
-
Modèles/sample_data.sqlModèles/sample_data.sql{{ config(Matérialisée='Table') }}
CHOISIR
id,
nom
DE (
VALEURS
(1, 'Alice'),
(2, 'Bob')
) COMME t(id, nom) -
Modèle d’exécution :
Run sample_datadbt run --select sample_data
Create a Model to Read Data
-
Créer un modèle :
-
Modèles/read_data.sqlModèles/read_data.sql{{ config(Matérialisée='Table') }}
CHOISIR
id,
nom,
LONGUEUR(nom) COMME name_length
DE {{ réf('sample_data') }} -
Modèle d’exécution :
Run read_datadbt run --select read_data
Verify Results
1. Monitor Job in Ilum UI:
-
Access the Ilum UI (URL provided in your Ilum setup, e.g. port-forward)
-
Navigate to the Jobs section
-
Look for the job named
ilum-sql-spark-engine -
Check job status, logs, and execution details to confirm successful processing
2. Query with Beeline:
beeline -u "jdbc:hive2://localhost:10009/default"3. Run query:
CHOISIR * DE faire défaut.read_data;Expected output:
+----+-----+------------+
| identifiant | Nom| name_length|
+----+-----+------------+
| 1 | Alice| 5 |
| 2 | Bob | 3 |
+----+-----+------------+
Spark Connect is the recommended way for modern data engineering teams to run dbt on Kubernetes. It eliminates the need for a heavy intermediate Thrift Server, reducing costs and complexity.
Step 1: Deploy Spark Connect Job
-
Se connecter à l’interface utilisateur d’Ilum
-
Navigate to Workloads → Emplois section
-
Click "New Job" bouton
-
Configure the job:
- Nom:
spark-connect-dbt - Job Type: Select Spark Connect Job
- Nom:
-
Add Spark Connect dependency (if needed):
Most Spark distributions don't include Spark Connect by default. You'll need to add it as a package dependency.
- Click the Configuration tab
- Dans le Paramètres section, click Add Parameter
- Add the following parameter:
Key Valeur spark.jars.packagesorg.apache.spark:spark-connect_2.12:3.5.8noteRemplacer
2.12with your Scala version and3.5.8with your Spark version to match your environment. -
Click Submit
The server starts successfully when you see this in the logs:
Spark Connect server started at: 0:0:0:0:0:0:0:0%0:15002
Connexion au serveur Spark Connect
Get the Connection URL
After the job starts, Ilum provides a Spark Connect URL on the job details page.
The URL format is: sc://job-xxxxx-driver-svc:15002
Port-Forward for Local Access
To connect from your local machine, forward the driver pod's port:
-
Find the driver pod name from the Journaux tab in Ilum UI
Exemple: If URL is
sc://job-20250807-1557-ablr2a52vxd-driver-svc:15002,
the pod name isjob-20250807-1557-ablr2a52vxd-driver(remove-svcsuffix) -
Port-forward :
Port Forwardkubectl port-forward <driver-pod-name> 15002:15002Keep this terminal window open.
Create dbt Project
Initialisez un projet dbt (si nécessaire) :
dbt init ilum_dbt_spark_connect_project
Answer the setup prompts:
Which database? 1 (étincelle)
host: localhost
Desired authentication method: 4 (session) #or 3 if u can't see session
port: 15002
schema: default
threads: 1
This creates the ilum_dbt_spark_connect_project directory and updates ~/.dbt/profiles.yml.
Configure dbt for Spark Connect
If you followed the Thrift setup above, your ~/.dbt/profiles.yml already has both targets configured. You can use the same ilum_dbt_project profile.
To use Spark Connect, simply specify the target:
cd ilum_dbt_project # Use the same project as Thrift
débogage dbt --target spark_connect
dbt run --target spark_connect
Or create a separate project (if you prefer isolation):
Éditer ~/.dbt/profiles.yml:
ilum_dbt_spark_connect_project:
cible: Dev
Sorties:
Dev:
type: étincelle
méthode: session
hôte: localhost
port: 15002
schéma: faire défaut
bobine: 1
Test the connection:
cd ..
cd ilum_dbt_spark_connect_project
débogage dbt
Recommended approach: Use one dbt project with multiple targets (as shown in the Thrift section). This allows you to switch between Thrift and Spark Connect without maintaining separate projects.
You should see successful connection messages.
Create a Model to Write Data
-
Créer un modèle :
-
Modèles/sample_data_connect.sqlModèles/sample_data_connect.sql{{ config(Matérialisée='Table') }}
CHOISIR
id,
nom
DE (
VALEURS
(1, 'Pierre'),
(2, 'Jean')
) COMME t(id, nom) -
Modèle d’exécution :
Run sample_data_connectdbt run --select sample_data_connect --target spark_connect
Create a Model to Read Data
-
Créer un modèle :
-
Modèles/read_data_connect.sqlModèles/read_data_connect.sql{{ config(Matérialisée='Table') }}
CHOISIR
id,
nom,
LONGUEUR(nom) COMME name_length
DE {{ réf('sample_data_connect') }} -
Modèle d’exécution :
Run read_data_connectdbt run --select read_data_connect --target spark_connectnoteLe
--target spark_connectflag ensures dbt uses the Spark Connect configuration instead of the default Thrift target.
Verify Results
-
Surveiller le travail dans l’interface utilisateur d’Ilum :
- Accédez à l’interface utilisateur d’Ilum (URL fournie dans votre configuration Ilum, par exemple port-forward).
- Accédez à la section Emplois.
- Recherchez l’emploi nommé spark-connect.
- Vérifiez l’état de la tâche, les journaux et les détails d’exécution pour confirmer la réussite du traitement.
-
Imprimer les données dans le Job dbt : Pour vérifier les données déposées dans l’entrepôt Spark (par exemple,
entrepôt-à-étincelles/read_data_connectpar rapport à votre répertoire de projet), créez une macro dbt et exécutez une opération personnalisée pour interroger et imprimer leread_data_connectcontenu de la table pendant la tâche DBT.Créez un fichier de macro dans le répertoire de votre projet dbt :
-
macros/print_table.sql:macros/print_table.sql{% macro print_table(table_name) %}
{% poser requête %}
CHOISIR * DE {{ réf(table_name) }}
{% jeu d’extrémité %}
{% faire rapport('Impression du contenu d’une table pour ' ~ table_name ~ ':', Vrai) %}
{% poser résultats = run_query(requête) %}
{% si résultats %}
{% pour ramer dans résultats %}
{% faire rapport(ramer, Vrai) %}
{% endpour %}
{% autre %}
{% faire rapport('Aucune donnée n’a été trouvée dans ' ~ table_name, Vrai) %}
{% endif %}
{% endmacro %}Exécutez la macro pour imprimer le
read_data_connectTableau après vos modèles DBT :Run Macrodbt run-operation print_table --args '{"table_name": "read_data_connect"}'Le
dbt run-operationexécute la macro, en interrogeant la commanderead_data_connecttable et l’enregistrement de son contenu. Sortie attendue dans les journaux dbt ou la console :Impression du contenu de la table pour read_data_connect :NoteThe output appears in the dbt logs or console by default in dbt 1.9.4. For more detailed logs, you can use:
Debug Macrodbt run-operation print_table --args '{"table_name": "read_data_connect"}' --log-level debug
-
Troubleshooting dbt-spark Connections
Common issues when connecting dbt to Spark on Kubernetes:
Error: "ThriftTransportException: Could not connect to localhost:10009"
Cause: The port forwarding tunnel is down or the Thrift Server pod is not running. Solution:
- Check if the Thrift pod is running:
kubectl get pods -l app.kubernetes.io/name=ilum-sql - Restart port-forwarding:
kubectl port-forward svc/ilum-sql-thrift-binary 10009:10009
Error: "grpc._channel._InactiveRpcError: failed to connect to all addresses"
Cause: Your local dbt client cannot reach the Spark Connect gRPC port (15002). Solution:
- Ensure you have port-forwarded the Driver Pod, not the Service (unless using NodePort).
- Verify you are using
Méthode : Séancedansprofiles.yml.
Error: "AnalysisException: Table or view not found"
Cause: Hive Metastore connectivity issue. Solution:
- Ensure
ilum-core.metastore.enabled=truewas set during Helm install. - Check if the schema (database) exists in Spark:
spark.sql("SHOW DATABASES").show()
Orchestration
For production orchestration using Apache Airflow, see the dedicated guide: Orchestrate dbt with Airflow