Spark集群仅单节点生效spark.local.dir等配置的问题求助
解决Spark Client模式下仅单个节点生效spark.local.dir/SPARK_WORKER_OPTS的问题
问题背景
运行Spark 3.5.0/PySpark 3.5.0集群(Client模式,5个Ubuntu 22.04.2 LTS节点)时出现“No Space Left on Device”错误,原因是Spark默认将shuffle和缓存文件写入worker节点的/tmp目录。尝试多种方式配置spark.local.dir、SPARK_LOCAL_DIRS及SPARK_WORKER_OPTS,但仅单个节点生效,其余节点仍使用默认路径,指定路径为全集群共享的高速挂载卷。
排查与修复步骤
1. 强制同步所有Worker节点的Spark配置文件
Client模式下,Driver在提交节点运行,Worker节点的配置不会自动同步,必须手动确保所有节点的spark-defaults.conf和spark-env.sh完全一致:
- 登录每个Worker节点,修改
$SPARK_HOME/conf/spark-defaults.conf,添加:spark.local.dir /mnt_path - 修改每个Worker节点的
$SPARK_HOME/conf/spark-env.sh,添加:export SPARK_LOCAL_DIRS=/mnt_path export SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.interval=60 -Dspark.worker.cleanup.appDataTtl=60" - 配置完成后,重启所有Worker节点的Spark服务:
$SPARK_HOME/sbin/stop-worker.sh $SPARK_HOME/sbin/start-worker.sh spark://<master-node-ip>:7077
2. 规避Client模式的配置覆盖陷阱
Client模式中,Driver端的配置可能无法正确传递给所有Worker的Executor,需注意:
- 不要混用
spark.local.dir和SPARK_LOCAL_DIRS:两者功能等价,优先用SPARK_LOCAL_DIRS(环境变量方式对Worker进程更直接) - 提交任务时,通过
--conf明确传递配置,确保Worker节点能识别:spark-submit \ --master spark://<master-node-ip>:7077 \ --conf "spark.local.dir=/mnt_path" \ --conf "spark.executorEnv.SPARK_LOCAL_DIRS=/mnt_path" \ your_script.py
3. 验证每个Worker节点的配置生效状态
在每个Worker节点执行以下操作确认配置加载:
- 查看Worker启动日志(默认在
$SPARK_HOME/logs),搜索spark.local.dir或SPARK_LOCAL_DIRS,确认路径为/mnt_path - 检查Worker进程的环境变量:
ps aux | grep spark-worker | grep SPARK_LOCAL_DIRS - 运行测试任务后,检查
/mnt_path下是否生成Spark临时文件
4. 确认共享挂载卷的权限配置
确保所有Worker节点的Spark运行用户对/mnt_path拥有读写权限:
sudo chown -R spark:spark /mnt_path sudo chmod -R 755 /mnt_path
核心提示
- Client模式下,Master仅负责资源分配,Worker的配置完全依赖本地
conf目录文件,所有节点配置必须完全一致 SPARK_WORKER_OPTS是Worker进程的启动参数,仅在Worker节点的spark-env.sh中配置才会生效,Driver端的配置无法传递给Worker进程
内容的提问来源于stack exchange,提问作者jaybeen
相关产品推荐
相关产品推荐

