我正在具有一个主节点和两个工作节点的gcloud dataproc集群上运行spark提交作业。 Spark作业需要解决来自受密码保护的私有关系存储库的依赖关系。 Spark集群也位于公司代理的后面。
我正在使用的spark提交命令是:
spark-submit --verbose --master yarn --deploy-mode cluster/client --conf "spark.jars.ivySettings=./ivysettings.xml" --conf "spark.executor.extraJavaOptions=-Dhttp.proxyHost=<proxy host> -Dhttp.proxyPort=<proxy port> -Dhttps.proxyHost=<proxy host> -Dhttps.proxyPort=<proxy port> -Drepo.username=<nexus username> -Drepo.password=<nexus password> -Djavax.net.ssl.trustStore=./truststore" --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=<proxy host> -Dhttp.proxyPort=<proxy port> -Dhttps.proxyHost=<proxy host> -Dhttps.proxyPort=<proxy port> -Drepo.username=<nexus username> -Drepo.password=<nexus password> -Djavax.net.ssl.trustStore=./truststore" --files ./truststore,./ivysettings.xml --packages groupId:artifactId:version somejar.jar
ivysettings.xml文件是:
<ivysettings>
<settings defaultResolver="nexus-resolver" />
<credentials host="<host>" realm="Sonatype Nexus Repository Manager" username="${repo.username}" passwd="${repo.password}"/>
<property name="repository-root" value="<nexus/repo/url>"/>
<resolvers>
<ibiblio name="nexus-resolver" m2compatible="true" root="${repository-root}"/>
</resolvers>
</ivysettings>
如果我使用客户端模式,这可以成功解决依赖关系并完成作业。但是,在群集模式下,尝试解决依赖关系时火花会挂起。
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
confs: [default]
最终由于服务器访问错误而超时。从代理访问日志中,我看到没有建立与代理的连接。
我可以看到spark正在通过检查调试输出来读取传递给执行程序的额外java选项。
我尝试过将其切入工作节点并从每个节点运行相同的命令。在这里,我遇到相同的行为(客户端模式无法在群集模式下工作)。这样可以排除工作节点上的防火墙设置。
我还尝试在所有框上的环境级别设置代理。行为相同。
似乎--packages在代理后面时无法在群集模式下工作吗?
答案 0 :(得分:0)
由于您依靠-Djavax.net.ssl.trustStore
设置指向已暂存的--files
文件,因此似乎在客户端与群集模式下暂存文件有关此问题。 https://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/Spark-job-fails-in-cluster-mode/td-p/58772
您可以尝试此处描述的修复程序,在其中对暂存的文件进行别名化,然后在java选项中引用短文件名:
--files ./truststore#truststore,./ivysettings.xml#ivysettings.xml ...
--conf "spark.jars.ivySettings=ivysettings.xml" ...
-Djavax.net.ssl.trustStore=truststore