Spark on Kubernetes配置local-dir报已存在/路径不唯一错误如何解决
解决Spark on Kubernetes动态executor场景下溢写磁盘持久化配置问题
报错根因说明
- 方案1报错原因:手动指定固定
claimName会导致所有executor尝试使用同名PVC,Kubernetes PVC名称全局唯一,因此仅第一个启动的executor能正常绑定PVC,后续executor均创建失败。动态executor场景下必须由Spark自动为每个executor生成独立PVC。 - 方案2报错原因:同一PVC挂载到多个executor的同一路径时,多个executor溢写进程会抢占同一目录的写入权限,Spark本身要求每个executor的本地工作路径独占,因此触发路径不唯一报错;且若PVC存储类不支持
ReadWriteMany访问模式,本身也无法同时挂载到多个节点。
正确配置步骤(适配动态executor场景)
配置逻辑
不需要提前手动创建PVC,直接通过SparkOperator的sparkConf配置自动为每个executor创建独立PVC,任务结束后PVC默认会随executor销毁自动清理。
配置示例
在SparkApplication资源的spec.sparkConf中添加以下配置即可:
sparkConf: # 开启executor动态PVC创建,由Spark自动生成唯一PVC名称 "spark.kubernetes.executor.volumes.persistentVolumeClaim.spill-data.options.claimName": "OnDemand" # 指定存储类,替换为实际使用的csi-rbd-sc "spark.kubernetes.executor.volumes.persistentVolumeClaim.spill-data.options.storageClass": "csi-rbd-sc" # 单executor溢写磁盘容量,可根据业务场景调整 "spark.kubernetes.executor.volumes.persistentVolumeClaim.spill-data.options.sizeLimit": "50Gi" # 配置PVC访问模式,单executor独占PVC用ReadWriteOnce即可 "spark.kubernetes.executor.volumes.persistentVolumeClaim.spill-data.mount.path": "/spill-data" "spark.kubernetes.executor.volumes.persistentVolumeClaim.spill-data.mount.readOnly": "false" # 配置Spark本地溢写路径为挂载的PVC路径 "spark.local.dir": "/spill-data"
补充说明
如果需要任务结束后保留溢写数据用于问题排查,可额外添加配置"spark.kubernetes.executor.deleteOnTermination": "false",关闭executor销毁时同步删除PVC的逻辑,后续手动清理即可。
内容的提问来源于stack exchange,提问作者Alex Ortner
相关产品推荐
相关产品推荐

