Databricks配置PySpark作业使用PEX依赖时遇文件不存在问题
在Databricks UI中运行带PEX依赖的PySpark作业解决方案
针对你遇到的PEX文件找不到的问题,核心原因是Databricks环境与EMR YARN的文件路径、工作目录结构存在差异,以下是可行的解决方法:
问题根源
- Databricks中
--files上传的文件并非存放在当前工作目录,而是每个节点的Spark临时存储目录,直接用./my_pex.pex无法定位到文件。 - 缺少PEX执行权限或未配置PEX临时解压目录的环境变量,导致PEX无法正常执行。
解决方案
方案1:直接使用DBFS绝对路径(最简便)
- 将PEX文件上传到DBFS(可通过Databricks UI或命令行同步),并赋予可执行权限:
dbutils.fs.chmod("dbfs:/deps/my_pex.pex", "755") - 修改spark-submit参数,指定PEX的绝对路径并配置PEX_ROOT:
[ "--conf", "spark.pyspark.driver.python=/dbfs/deps/my_pex.pex", "--conf", "spark.pyspark.executor.python=/dbfs/deps/my_pex.pex", "--conf", "spark.driverEnv.PEX_ROOT=/tmp/pex_temp", "--conf", "spark.executorEnv.PEX_ROOT=/tmp/pex_temp", "dbfs:/path/to/main.py", "--some_arg", "2022-08-01" ]
方案2:结合--files与Spark临时目录路径
如果必须通过--files传递PEX,可通过Spark本地目录定位文件:
[ "--files", "s3://some_path/my_pex.pex", "--conf", "spark.pyspark.driver.python=$(find ${SPARK_LOCAL_DIRS} -name my_pex.pex | head -1)", "--conf", "spark.pyspark.executor.python=$(find ${SPARK_LOCAL_DIRS} -name my_pex.pex | head -1)", "--conf", "spark.driverEnv.PEX_ROOT=/tmp/pex_temp", "--conf", "spark.executorEnv.PEX_ROOT=/tmp/pex_temp", "s3://some_path/main.py", "--some_arg", "2022-08-01" ]
${SPARK_LOCAL_DIRS}是Databricks节点上Spark临时目录的环境变量,通过find命令可准确定位到上传的PEX文件。
方案3:使用集群初始化脚本同步PEX到本地
创建集群初始化脚本(同步PEX到每个节点本地目录并赋予权限):
#!/bin/bash # 从S3同步PEX到本地临时目录 aws s3 cp s3://some_path/my_pex.pex /tmp/my_pex.pex # 添加可执行权限 chmod +x /tmp/my_pex.pex
将脚本上传到DBFS后,在集群配置中添加该初始化脚本。之后spark-submit参数可直接使用本地路径:
[ "--conf", "spark.pyspark.driver.python=/tmp/my_pex.pex", "--conf", "spark.pyspark.executor.python=/tmp/my_pex.pex", "--conf", "spark.driverEnv.PEX_ROOT=/tmp/pex_temp", "--conf", "spark.executorEnv.PEX_ROOT=/tmp/pex_temp", "s3://some_path/main.py", "--some_arg", "2022-08-01" ]
注意事项
- 确保PEX文件是针对Databricks Runtime的Python版本打包的(比如Runtime 11.3用Python 3.8,打包PEX时需对应版本)。
- 避免使用相对路径引用PEX,Databricks的工作目录结构与EMR不同,相对路径不可靠。
PEX_ROOT需指定节点上有写入权限的目录,默认/tmp即可满足需求。
内容的提问来源于stack exchange,提问作者r_g_s_
相关产品推荐
相关产品推荐

