如何在spark-submit命令中指定要使用的Java版本?

18

我希望在远程服务器上的yarn集群上运行一个Spark流应用程序。服务器上默认的Java版本是1.7,但我的应用程序需要使用1.8,而且1.8也已经安装在服务器上,但不是默认版本。是否有一种方法可以通过spark-submit指定Java 1.8的位置,以便避免出现主要次要错误?


2
你使用Maven吗?如果是的话,你可以在pom.xml中指定Java版本。 - M. Suurland
4
或许您可以在执行 spark-submit 命令前设置 JAVA_HOME。像这样:"JAVA_HOME=/path/to/java ./bin/spark-submit......"。 - Hlib
3
在执行spark-submit命令之前,设置JAVA_HOME对我很有用。谢谢 :) - Priyanka
1
@Hlib,这样做会更改当前应用程序的驱动程序的Java版本,而不是集群中也具有默认Java版本1.7的执行程序。您能否提出解决方法? - Priyanka
1
你试过在 $SPARK_HOME$/conf/spark-env.sh 中指定 JAVA_HOME 吗? - Hlib
显示剩余2条评论
5个回答

16

JAVA_HOME在我们的情况下不够用,驱动程序在java 8中运行,但我后来发现YARN中的Spark worker使用java 7启动(hadoop节点安装了两个Java版本)。

我不得不在spark-defaults.conf中添加spark.executorEnv.JAVA_HOME=/usr/java/<workers可用版本>。请注意,您可以在命令行中使用--conf提供它。

参见http://spark.apache.org/docs/latest/configuration.html#runtime-environment


2
对于那些无法访问或没有权限在工作节点上检查Java版本的人,可以使用spark.range(0, 100).mapPartitions(_.map(_ => java.lang.System.getProperty("java.version"))).show进行健全性检查。通过yarn / spark UI来确定运行时Java版本可能太困难了。 - shay__
1
需要设置 spark.executorEnv.JAVA_HOME 和 _spark.yarn.appMasterEnv.JAVA_HOME_。 - Avinash Ganta

4
虽然您可以强制Driver代码在特定的Java版本上运行(export JAVA_HOME=/path/to/jre/ && spark-submit ... ),但工作节点将使用来自工作机器上yarn用户PATH的默认Java版本执行代码。
您可以通过编辑spark-env.sh文件(documentation)设置每个Spark实例使用特定的JAVA_HOME

2
如果您想为在yarn上运行的spark设置Java环境,您可以在spark-submit之前进行设置。
--conf spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8.0_121 \

1
在spark-env.sh中添加您想要的JAVA_HOME(sudo find -name spark-env.sh ...例如:/etc/spark2/conf.cloudera.spark2_on_yarn/spark-env.sh)

1

Java版本需要设置为在YARN上启动的Spark App Master和Spark Executors。因此,spark-submit命令必须包含两个JAVA_HOME设置:spark.executorEnv.JAVA_HOMEspark.yarn.appMasterEnv.JAVA_HOME

spark-submit --class com.example.DataFrameExample --conf "spark.executorEnv.JAVA_HOME=/jdk/jdk1.8.0_162" --conf "spark.yarn.appMasterEnv.JAVA_HOME=/jdk/jdk1.8.0_162" --master yarn --deploy-mode client /spark/programs/DataFrameExample/target/scala-2.12/dfexample_2.12-1.0.jar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接