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

6

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

我已经运行了一个远程yarn集群,并且可以连接到yarn集群并在SparkR中运行Spark作业。但是当我尝试在scala应用程序中执行类似的操作时,它无法加载我的环境变量到yarn配置中,而是使用默认的yarn地址和端口。

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>

我怎样才能正确地将Yarn集群配置的环境变量添加到这个sbt Spark应用程序中?
额外信息:
我的系统是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")
1个回答

8
这些天,没有一个开箱即用的解决方案可以避免在Yarn模式下使用spark-submit。
Spark-submit:为了运行作业,spark-submit在配置环境上运行org.apache.spark.deploy.yarn.Client代码(或者像您的情况一样未配置)。这是执行任务提交的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

关于SparkR.R,它内部使用spark-submit: https://github.com/apache/spark/blob/master/R/pkg/R/sparkR.R 当它从https://github.com/apache/spark/blob/master/R/pkg/R/client.R调用时, 已经设置了所有环境和参数。

谢谢,我没想到这会这么麻烦。你有没有尝试在Mesos应用程序中使用Spark?如果我们明确向Spark提供Mesos主地址端口,那会更容易吗? - Bamqf
抱歉,还没有机会检查Mesos。 - Elena Viter

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