Spark集群模式提交作业报错:Java路径指向本地而非容器路径
问题分析与解决思路
核心原因
这不是fat-jar构建配置的问题,本质是cluster模式下,本地执行spark-submit时,客户端将自身的Java环境路径传递给了容器内的Driver节点。
client模式中Driver在本地机器启动,直接使用本地Java环境自然正常;但cluster模式下Driver是在容器化的Worker节点上启动的,你本地的JAVA_HOME参数被传递到容器后,Driver会尝试调用本地机器的Java路径/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java,而容器内实际Java路径是Bitnami镜像自带的/opt/bitnami/java/bin/java,因此出现找不到可执行文件的错误。
解决方法
1. 提交命令中强制指定容器内Java路径
在spark-submit时通过--conf参数,直接为Driver和Executor指定容器内的Java路径:
spark-submit --deploy-mode cluster --class "CsvToDelta" --master spark://localhost:7077 \ --conf spark.driver.java=/opt/bitnami/java/bin/java \ --conf spark.executor.java=/opt/bitnami/java/bin/java \ 'linkToS3Jar'
2. 配置Spark集群全局默认值
修改容器化集群的spark-defaults.conf文件,添加全局配置避免每次提交重复指定:
spark.driver.java=/opt/bitnami/java/bin/java spark.executor.java=/opt/bitnami/java/bin/java
如果是Docker Compose部署的Bitnami集群,可通过挂载自定义配置文件或设置环境变量的方式完成修改。
3. 确保S3 jar的访问权限
额外注意:cluster模式下Worker容器需要能正常访问S3上的jar包,需为容器配置正确的AWS凭证(如通过AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量),避免权限问题引发其他异常。
内容的提问来源于stack exchange,提问作者o_O
相关产品推荐
相关产品推荐

