Databricks集群运行PySpark脚本报master URL未配置错误解决方法
问题原因
报错本质是把本地运行的PySpark逻辑直接套到Databricks集群上,没适配两者的Spark初始化差异:
- 本地PyCharm跑单机PySpark时,需要手动指定
local模式的master地址才能启动Spark进程,这个逻辑在本地没问题。但Databricks集群启动时已经提前初始化好了全局共享的SparkSession和SparkContext,作业运行时不需要手动创建Spark实例,硬写master配置反而会和集群内置配置冲突。 - 贴出来的示例代码和实际在集群上跑的代码不一致:报错栈显示实际代码里在类加载阶段直接调用了
SparkContext.getOrCreate(),既没有传入集群的master配置,也没有复用集群已经初始化好的上下文,自然会报master URL缺失的错误。 - 额外提一句,代码里写的
.master('local[*, 4]')本身就是语法错误,local模式的正确写法是local[*](匹配所有CPU核心)或者local[4](指定4个线程),不存在两个参数的写法,本地能跑大概率是低版本PySpark没做参数校验,集群环境会直接拦截非法配置。 - 现在用裸
python -m的方式直接跑脚本文件,走的是普通Python进程入口,不会自动加载Databricks集群的Spark配置,手动创建SparkContext时自然拿不到master地址。
修复方法
按优先级修改即可:
- 删掉所有手动Builder SparkSession、手动单独创建SparkContext的代码,直接获取集群已经初始化好的活跃SparkSession即可,改完的参考代码:
from pyspark.sql import SparkSession print("START") # 直接复用集群预初始化的Spark对象,不要自行实例化 spark = SparkSession.getActiveSession() print(spark) data = [('James', '', 'Smith', '1991-04-01', 'M', 3000), ('Michael', 'Rose', '', '2000-05-19', 'M', 4000), ('Robert', '', 'Williams', '1978-09-05', 'M', 4000), ('Maria', 'Anne', 'Jones', '1967-12-01', 'F', 4000), ('Jen', 'Mary', 'Brown', '1980-02-17', 'F', -1) ] columns = ["firstname", "middlename", "lastname", "dob", "gender", "salary"] df = spark.createDataFrame(data=data, schema=columns) df.show() # 原代码的print(df)只会打印DataFrame的对象描述,要查看数据用show()方法
- 如果同一份代码要兼容本地调试和Databricks集群运行,加个环境判断分支,本地环境才手动初始化Spark实例:
from pyspark.sql import SparkSession import os # 用Databricks内置环境变量判断运行环境 if "DATABRICKS_RUNTIME_VERSION" in os.environ: spark = SparkSession.getActiveSession() else: # 本地运行才手动指定master,顺便修正原来的参数语法错误 spark = SparkSession.builder \ .appName("myapp") \ .master("local[*]") \ .getOrCreate()
- 把代码里类层级直接写的
sc = SparkContext.getOrCreate()删掉,需要用到SparkContext的时候直接从spark实例取:sc = spark.sparkContext,不要单独创建SparkContext实例,避免上下文冲突。
避坑提示
- 不要在Databricks上硬编码master为local模式,local模式只会在驱动节点起单机进程,根本没法用到集群的计算资源,完全浪费集群能力。
- 如果是用CI/CD或者SDK提交作业到Databricks,不要直接用裸
python -m命令跑脚本,用官方的作业提交入口,会自动注入所有Spark相关配置,少踩很多环境问题。
内容的提问来源于stack exchange,提问作者dzoku
相关产品推荐
相关产品推荐

