我希望在远程服务器上的yarn集群上运行一个Spark流应用程序。服务器上默认的Java版本是1.7,但我的应用程序需要使用1.8,而且1.8也已经安装在服务器上,但不是默认版本。是否有一种方法可以通过spark-submit指定Java 1.8的位置,以便避免出现主要次要错误?
我希望在远程服务器上的yarn集群上运行一个Spark流应用程序。服务器上默认的Java版本是1.7,但我的应用程序需要使用1.8,而且1.8也已经安装在服务器上,但不是默认版本。是否有一种方法可以通过spark-submit指定Java 1.8的位置,以便避免出现主要次要错误?
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
spark.range(0, 100).mapPartitions(_.map(_ => java.lang.System.getProperty("java.version"))).show
进行健全性检查。通过yarn / spark UI来确定运行时Java版本可能太困难了。 - shay__export JAVA_HOME=/path/to/jre/ && spark-submit ...
),但工作节点将使用来自工作机器上yarn用户PATH的默认Java版本执行代码。spark-env.sh
文件(documentation)设置每个Spark实例使用特定的JAVA_HOME
。--conf spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8.0_121 \
Java版本需要设置为在YARN上启动的Spark App Master和Spark Executors。因此,spark-submit命令必须包含两个JAVA_HOME设置:spark.executorEnv.JAVA_HOME和spark.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