Spark基础:Spark on Yarn(上)

Posted xingoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark基础:Spark on Yarn(上)相关的知识,希望对你有一定的参考价值。


往期链接:






1 在Yarn上启动Spark

要想使spark运行在yarn上,先决条件是spark启动节点上包含 HADOOP_CONF_DIR 或 YARN_CONF_DIR 环境变量,该变量指向的目录包含了 hdfs、 yarn相关的配置。该目录下的配置文件会分发到YARN集群的每个节点,从而保证每个容器都使用相同的配置。如果配置中包含Spark相关的应用配置,如driver、executor等,会自动添加到SparkConf中。

Spark基于Yarn有两种运行模式:cluster,集群模式,即Spark Driver程序运行在Yarn集群中的App Master上,客户端会在启动App Master后自动关闭;client,客户端模式,即driver程序运行在客户端,App Master程序仅负责申请资源。

比如,以cluster模式启动任务的命令如下:

./bin/spark-submit
--class path.to.your.Class
--master yarn
--deploy-mode cluster
[options]
<app jar>
[app options]

./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
examples/jars/spark-examples*.jar \
10

上面的例子中启动了一个Yarn客户端程序,该程序目的就是启动一个 Yarn 的 Application Master。其中SparkPi这个程序将会运行在 App Master 程序中。客户端会周期性的访问 App Master, 查看应用的运行状态并展示在控制台上。当应用执行完毕时,客户端程序会立刻退出。如果想以client模式启动,那么只需要把cluster替换成client就可以了。

在cluster模式中,driver与client运行在不同的机器上,因此SparkContext.addJar不能直接在客户端使用,也就是说client端的jar包不能直接在driver上使用。为了让driver能够使用client端的jar包资源,可以在命令行中使用--jars参数:

$ ./bin/spark-submit \
--class my.main.Class \
--master yarn \
--deploy-mode cluster \
--jars my-other-jar.jar,my-other-other-jar.jar \
my-main-jar.jar \
app_arg1 app_arg2

2 环境准备

直接在官网可以选择hadoop版本的spark二进制安装包,解压就可以使用。为了在yarn上使用spark运行时的jar,可以配置 spark.yarn.archive 或 spark.yarn.jars , 这样可以避免每次都从client端上传spark相关的jar。如果没有配置该选项,那么spark会把HOME/jars下的文件打成zip压缩包,然后上传到hdfs中。

3 调试应用

在yarn的中,executor 和 app master 都运行在内部的容器 container 中。如果开启 yarn.log-aggregation-enable,容器中的日志会被拷贝到HDFS上并删除本地日志。这些日志可以通过yarn logs --applicationId <id>。如果没有开启日志聚合,日志会保存在本地 YARN_APP_LOGS_DIR 目录下,一般都是配在 /tmp/logs 或 $HADOOP_HOME/logs/userlogs 下。如果想看某个容器的日志,需要登录到容器所在的节点,并进入对应的目录,目录为 appId/containerId。如果想要应用停止后,还想查看相关信息,需要增加 yarn.nodemanager.delete.debug-delay-sec 的值, 如36000,可以确保当应用执行结束后,日志还会保留一段时间。进入 yarn.nodemanager.local-dirs 指定的应用缓存目录,这个目录包含了启动脚本、jar包、环境变量等,通过这个方法可以帮助定义特殊的类加载或环境变量问题。

如果想要使用自定义的log4j日志配置,需要下面几个步骤:使用spark-submit的--files参数上传log4j.properties;增加 -Dlog4j.configuration=<配置文件目录> 到 spark.driver.extraJavaOptions 或 spark.executor.extraJavaOptions。注意如果使用文件,需要满足file:协议,并且每个节点上的对应目录都有该文件;更新 $SPARK_CONF_DIR/log4j.properties文件,他会自动上传,注意前面两个优先级要比这个高。如果使用第一种方式,那么 app master 和 executor 都会使用相同的配置。

yarn的相关配置参考:

存放日志的配置如下:
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<source>yarn-site.xml</source>
</property>

<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<source>yarn-default.xml</source>
</property>

<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
<source>yarn-default.xml</source>
</property>

日志保留时间
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
<source>yarn-site.xml</source>
</property>

history访问地址
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
<source>mapred-default.xml</source>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hnode10:19888</value>
<source>mapred-site.xml</source>
</property>

应用执行完日志保留的时间,默认0,即执行完立刻删除
<property>
<name>yarn.nodemanager.delete.debug-delay-sec</name>
<value>0</value>
<source>yarn-default.xml</source>
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>${hadoop.tmp.dir}/nm-local-dir</value>
<source>yarn-default.xml</source>
</property>


以上是关于Spark基础:Spark on Yarn(上)的主要内容,如果未能解决你的问题,请参考以下文章

Spark基础学习笔记06:搭建Spark On YARN模式的集群

:环境搭建-Spark on YARN

Spark on Yarn 为啥出现内存超界container被kill

Spark on yarn

Spark On Yarn部署

Spark-on-YARN