PySpark配置spark.local.dir解决No space left on device磁盘不足报错
配置不生效的核心原因
你尝试的配置未生效有两个原因:
- 你使用的
spark.local.dirs为非官方的错误配置项,Spark 3.1.2的官方标准临时目录配置项为单数的spark.local.dir - 该配置属于Spark启动时加载的静态配置,必须在
SparkSession初始化完成前配置,你在调用getOrCreate()之后再修改配置,不会覆盖已经加载完成的运行时参数。
可用解决方案
方法1:构建SparkSession时直接指定配置
在创建SparkSession的builder阶段传入临时目录参数,示例代码如下:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config('spark.local.dir', '/home/tmp') \ .getOrCreate()
如果需要配置多块磁盘的路径提升IO性能,可以用逗号分隔多个路径:
.config('spark.local.dir', '/home/tmp1,/data/tmp2')
方法2:通过环境变量全局配置
如果不想每次写代码都指定,可以在Ubuntu系统中配置SPARK_LOCAL_DIRS环境变量,生效范围为当前用户的所有PySpark任务:
- 编辑当前用户的bash配置文件:
vim ~/.bashrc
- 末尾添加如下内容:
export SPARK_LOCAL_DIRS=/home/tmp
- 加载配置使其生效:
source ~/.bashrc
之后启动的所有PySpark任务都会默认使用你指定的路径作为临时文件存储目录。
方法3:启动pyspark命令时直接传参
如果是通过命令行直接启动pyspark交互环境,可以在启动命令中带上参数:
pyspark --conf spark.local.dir=/home/tmp
注意事项
- 配置前需要提前创建你指定的目录,比如示例中的
/home/tmp,并且保证运行PySpark的用户对该目录有读写权限,可以用如下命令设置权限:
mkdir -p /home/tmp && chmod 777 /home/tmp
- 如果你是在YARN集群模式下运行任务,还需要同时配置YARN的节点本地目录
yarn.nodemanager.local-dirs,否则Shuffle临时文件还是会写入默认路径。
内容的提问来源于stack exchange,提问作者Russell Burdt
相关产品推荐
相关产品推荐

