WSL本地环境dbt-spark[session]运行Python模型报错求排查
已在Windows 11的WSL中配置带Hive支持和元数据存储的PySpark,spark-sql可正常运行。安装dbt-spark[session]适配器后,尝试创建Python dbt模型,profiles.yml配置如下:
local_spark: target: dev outputs: dev: type: spark host: local method: session schema: default file_format: delta
通过已激活的本地Spark会话(method:session)运行Python模型,先创建PySpark会话再调用dbtRunner的dbt.invoke方法,代码如下:
# Initialize the dbtRunner dbt = dbtRunner() # Define the dbt command to run, for example: `dbt run --models my_model` cli_args = ["run", "--select", "stage", "--project-dir", "<my project folder>", "--profiles-dir", "<my profile folder>"] # Use the invoke method to run the command result = dbt.invoke(cli_args)
运行时出现错误:
Databricks cluster_id is required for all_purpose_cluster submission method with running with notebook.
未使用dbt-databricks适配器且指定了method:session,求问题原因及缺失配置。
原因
错误源于dbt-spark的session模式在Python脚本调用场景下,误将运行环境识别为Databricks notebook环境,触发了all_purpose_cluster提交逻辑,而非复用本地已有的Spark会话。
解决步骤
修改profiles.yml配置
在dev输出配置中添加spark_session: existing,明确告知适配器复用当前已初始化的Spark会话:local_spark: target: dev outputs: dev: type: spark host: local method: session schema: default file_format: delta spark_session: existing确保Spark会话提前初始化
在调用dbt.invoke()前,必须显式创建并初始化PySpark会话,保证会话能被dbt检测到,调整后的代码示例:from pyspark.sql import SparkSession from dbt.cli.main import dbtRunner # 初始化PySpark会话 spark = SparkSession.builder \ .appName("dbt-local-session") \ .enableHiveSupport() \ .getOrCreate() # 初始化dbtRunner并执行命令 dbt = dbtRunner() cli_args = ["run", "--select", "stage", "--project-dir", "<my project folder>", "--profiles-dir", "<my profile folder>"] result = dbt.invoke(cli_args)检查版本兼容性
确认dbt-spark与本地PySpark版本匹配,比如PySpark 3.3.x对应dbt-spark1.6.x系列,版本不匹配可能导致适配器逻辑异常。
内容的提问来源于stack exchange,提问作者rarpal

