将 Yarn 集群配置添加到 Spark 应用程序

Add Yarn cluster configuration to Spark application

我正在尝试在 scala sbt 应用程序中使用 spark on yarn,而不是直接使用 spark-submit

我已经有一个远程 yarn 集群 运行ning,我可以在 SparkR 中连接到 yarn 集群 运行 spark 作业。但是当我尝试在 scala 应用程序中做类似的事情时,它无法将我的环境变量加载到纱线配置中,而是使用默认的纱线地址和端口。

sbt 应用程序只是一个简单的对象:

object simpleSparkApp {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName("simpleSparkApp")
      .setMaster("yarn-client")
      .set("SPARK_HOME", "/opt/spark-1.5.1-bin-hadoop2.6")
      .set("HADOOP_HOME", "/opt/hadoop-2.6.0")
      .set("HADOOP_CONF_DIR", "/opt/hadoop-2.6.0/etc/hadoop")
    val sc = new SparkContext(conf)
  }
}

当我在 Intellij IDEA 中 运行 这个应用程序时,日志显示:

15/11/15 18:46:05 INFO RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
15/11/15 18:46:06 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
15/11/15 18:46:07 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
...

似乎环境添加不正确,因为0.0.0.0不是远程yarn资源管理器节点的ip,我的spark-env.sh有:

export JAVA_HOME="/usr/lib/jvm/ibm-java-x86_64-80"
export HADOOP_HOME="/opt/hadoop-2.6.0"
export HADOOP_CONF_DIR="$HADOOP_HOME/etc/hadoop"
export SPARK_MASTER_IP="master"

我的 yarn-site.xml 有:

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
</property>

如何正确地为这个 sbt Spark 应用程序添加 Yarn 集群配置的环境变量?

补充信息:

我的系统是Ubuntu14.04,可以连接yarn集群的SparkR代码如下:

Sys.setenv(HADOOP_HOME = "/opt/hadoop-2.6.0")
Sys.setenv(SPARK_HOME = "/opt/spark-1.4.1-bin-hadoop2.6")
.libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths()))
library(SparkR)
sc <- sparkR.init(master = "yarn-client")

目前,没有开箱即用的解决方案来避免 Yarn 模式的 spark-submit 使用。

Spark-submit : 到 运行 作业,spark-submit 运行 org.apache.spark.deploy.yarn.Client 配置环境中的代码(或未按照您的情况配置)。这是执行任务提交的客户端:https://github.com/apache/spark/blob/master/yarn/src/main/scala/org/apache/spark/deploy/yarn/Client.scala

有什么解决办法?

  1. 可以在此处找到覆盖客户端行为的选项 http://blog.sequenceiq.com/blog/2014/08/22/spark-submit-in-java/ 这样您就可以添加额外的环境变量等。 后来 Spark 将 Yarn 客户端私有化到 spark 包中(~ 2014 年底)。因此,如果将您的包裹命名为 org.apache.spark - 可能是一个选项..

  2. 此处描述了基于 spark-submit 解决方案(及其优点和缺点)的构建: http://www.henningpetersen.com/post/22/running-apache-spark-jobs-from-applications

What about SparkR.R, it uses spark-sumbit internally : https://github.com/apache/spark/blob/master/R/pkg/R/sparkR.R when it call launchBackend() from https://github.com/apache/spark/blob/master/R/pkg/R/client.R and give there all environment set already + arguments