我正在尝试在scala-sbt应用程序中使用spark-on-yarn,而不是直接使用spark-submit
。
我已经有一个远程纱线集群在运行,我可以连接到SparkR中运行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
不是远程纱线资源管理器节点的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,可以连接到纱线集群的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
解决方案是什么?
-
可以在此处找到覆盖客户端行为的选项http://blog.sequenceiq.com/blog/2014/08/22/spark-submit-in-java/以便您可以添加额外的env变量等。后来,Spark将Yarn客户私有化为Spark包(~ 2014年底)。因此,如果将你的包命名为org.apache.spark-可能是一种选择。。
-
这里描述了构建在spark之上的提交解决方案(及其优点和缺点):http://www.henningpetersen.com/post/22/running-apache-spark-jobs-from-applications
SparkR.R呢,它在内部使用spark sumbit:https://github.com/apache/spark/blob/master/R/pkg/R/sparkR.R当它从调用launchBackend()时https://github.com/apache/spark/blob/master/R/pkg/R/client.R并给那里所有的环境集已经+参数