EKS部署spark-operator运行spark-pi时报无法创建临时目录错误如何解决
问题根因说明
前面的非法反射访问警告属于Spark 3.1.x与Java 11及以上版本的兼容性提示,不会导致任务失败,可以直接忽略。
核心报错java.io.IOException: Failed to create a temp directory (under /tmp) after 10 attempts!的原因是Spark提交进程没有/tmp目录的写入权限,可通过以下方案解决:
解决方案
- 方案1:配置Spark任务运行身份为root用户,直接获得/tmp写入权限
在你的spark-pi.yaml的spec字段中添加driver和executor的安全上下文配置:
spec: driver: securityContext: runAsUser: 0 executor: securityContext: runAsUser: 0
- 方案2:修改Spark临时目录路径,规避/tmp权限限制
在spec的sparkConf中指定自定义临时目录位置(Spark工作目录默认有写入权限):
spec: sparkConf: "spark.driver.extraJavaOptions": "-Djava.io.tmpdir=/opt/spark/work-dir/tmp" "spark.executor.extraJavaOptions": "-Djava.io.tmpdir=/opt/spark/work-dir/tmp" "spark.local.dir": "/opt/spark/work-dir/tmp"
方案3:调整集群Pod安全策略
如果你的EKS集群开启了Pod安全准入/ Pod安全策略,将spark-operator服务账号所在命名空间的安全限制调整为baseline级别,或给对应服务账号授予写入/tmp目录的权限。方案4:修改Spark镜像的/tmp目录权限
如果使用自定义Spark镜像,可在Dockerfile中添加一行配置,放开/tmp目录的全局写入权限:
RUN chmod 1777 /tmp
内容的提问来源于stack exchange,提问作者Anand Jain
相关产品推荐
相关产品推荐

