Spark在 0.6.0版本后支持在YARN(hadoop NextGen)上运行,并且在后续版本中不断改进。
在YARN上启动Spark
首先,确认 HADOOP_CONF_DIR或YARN_CONF_DIR指向的包含了Hadoop集群的配置文件。这些配置用于操作HDFS和连接YARN资源管理器。在这个目录下的这些配置文件将被分发到YARN集群中,因此应用所使用的容器能够使用相同的配置。如果配置中的java系统参数或环境变量没有被YARN所管理,就必须设置在Spark应用的配置中(驱动、执行器、和运行在客户端模式下的应用Master)
有两种模式能够在YARN下启动Spark应用,YARN集群模式和YARN客户端模式。在Yarn集群方式,Spark驱动运行在,YARN管理的运行在集群上的应用主进程中,客户端程序在应用初始化后就结。在YARN何况模式下,驱动运行在客户端进程中,应用主进程只能使用在YARN中请求的资源。
不同于standalone和Mesos模式中通过 –master 参数指定master 地址。在YARN模式中,资源管理器地址在HADOOP配置中获取。所以, –master参数可选yarn-client或yarn-cluster。
下面的命令能够在YARN cluster下运行SPARK 应用:
./bin/spark-submit --class path.to.your.Class --master yarn-cluster [options] [app options]
例如:
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors 3 \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
lib/spark-examples*.jar \
10
上面的命令启动了一个YARN端程序,调用默认的应用Master,SparkPi作为Master的子线程运行。客户端定期连向应用Master更新并在console中显示状态。当应用结束后客户端进程也会退出。在后面的“调试应用”小节,将介绍如何查看驱动器和执行器的日志。
同样可以在YARN客户端模式下运行Spark应用,只需要将“yarn-cluster”换成“yarn-client”
$ ./bin/spark-shell --master yarn-client
添加其他JAR包
在yarn-culster模式下,驱动器和客户端在不同的集群上运行,所以在保存在客户端上文件不能通过SparkContext.addJar加入到运行沙盒中。为了让SparkContext.addJar能够使用客户端上的这些文件,需要把他们通过–jar选项加入到启动命令中。
$ ./bin/spark-submit --class my.main.Class \
--master yarn-cluster \
--jars my-other-jar.jar,my-other-other-jar.jar
my-main-jar.jar
app_arg1 app_arg2
准备工作
在YARN上运行Spark需要一个支持YARN的Spark二进制包,这个包可以在Spark项目网站上下载。
配置
Spark在YARN上的大部分配置项和其他部署模式相同,可以在后面配置项一节获得更多关于此的信息,这些配置仅用于在YARN上运行Spark。
应用调试
用YARN术语来说,执行器、应用Master都在容器(container)内运行。在应用结束后YARN会采用2种方式处理容器日志。如果开启了日志归集(yarn.log-aggregation-enable),日志将被拷到HDFS上,本地文件将被删除。这些日志可以通过’yarn logs’命令在集群的任何节点查看。
yarn logs -applicationId
上面的命令会打印出应用所有容器的日志文件内容。当然也可以直接在hdfs查看容器日志。存入日志的目录通过yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix配置。同样,也可以在Spark web UI的执行器Tab页下查看相关日志。前提是需要在 yarn-site.xml中配置 yarn.log.server.url,并保证Spark历史服务器和MapReduce历史服务器正常运行。Spark历史服务器UI上的log连接会重定向到MapReduce历史服务器来显示归集的日志。
如果没有开启日志归集,日志会保存在各个机器的YARN_APP_LOGS_DIR下,根据Hadoop版本或安装的不同一般是/tmp/logs 或 $HADOOP_HOME/logs/userlogs。需要登录到各台机器上去查看日志,这些日志会按应用id和容器id的结构来分子目录保存。同样可以通过Spark Web Ui来查看日志,而不需要MapReduce历史服务器。
通过增加yarn.nodemanager.delete.debug-delay-sec,如36000,可以在容器启动的各个节点yarn.nodemanager.local-dirs目录保留的应用缓存中查看每个容器的启动环境。这个目录下保存了启动脚本、Jar包、启动是的环境变量等信息。这对调试,特别是Classpath问题很有用。注,这些设置需要集群管理员权限,并且要重启所有的节点管理器,所以在托管集群上很难完成。
有几种可选方式给应用Master和执行器配置定制化的log4j配置:
- 1.通过在上传应用的时候(spark-submit),在-file里增加log4j.properties文件
- 2.在执行器的spark.driver.extraJavaOptions,或在驱动器的spark.executor.extraJavaOptions 选项,增加-Dlog4j.configuration=;。注,如果使用文件,需要明确指定,并且需要在所有节点存在。
- 3. 更新$SPARK_CONF_DIR/log4j.properties文件,此配置会和其他配置一起自动上传。注:如果指定了多个选项,另外2个选项的优先级高于本配置。
如果采用第一个方式,需要注意的是,执行器和应用Master使用同一个log4j配置,当他们跑在同一个节点的时候会有问题(如,尝试写同一个日志文件)。
如果需要在YARN上显示、汇聚日志,需要通过在log4j.properties用spark.yarn.app.container.log.dir配置相对路径。例如,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log
对于streaming应用,配置configuring RollingFileAppender并把路径设置到YARN目录里,可以避免由于日志过大而硬盘空间不够的问题。同时这些log还可以用YARN日志工具访问。
配置项
在YANR上,大部分的配置和其他部署方式相同。可以参考http://spark.apache.org/docs/latest/configuration.html
但是下列是在YARN环境特有的配置项
名称 | 默认值 | 说明 |
---|---|---|
spark.yarn.am.memory | 512m | 在终端模式下YARN应用Master使用的内存总量,和JVM配置的格式一样(如,512m、2g)在集群模式下,用spark.driver.memory设定 |
spark.driver.cores | 1 | 在YARN集群模式下,驱动器使用的内核数。集群模式下,驱动器与YARN应用Master运行在同一个JVM中,所以这个参数还限定了应用Master使用的内核数。在终端摩梭下,用spark.yarn.am.cores设定应用Master使用的内核数 |
spark.yarn.am.cores | 1 | 在终端模式下,YARN应用Master使用的内核数 |
spark.yarn.am.waitTime | 100s | 在YARN集群模式下,代表应用Master等待SparkContxt进行初始化的时间。在YARN终端模式下,代表应用Master等待驱动器连接的时间 |
spark.yarn.submit.file.replication | HDFS 默认副本数(一般是3) | 应用上次文件到HDFS时使用的HDFS复制数量。包括Spark jar、应用Jar,或者其他任意分布式缓存文件或归档。 |
spark.yarn.preserve.staging.files | false | 如果设置为true,在任务结束时保留中文件,Spark Jar,App Jar,分布式缓存文件等。 |
spark.yarn.scheduler.heartbeat.interval-ms | 3000 | Spark 应用Master与YARN资源管理器保持心跳的周期,单位为毫秒(ms)。上限是YARN失效周期(yarn.am.liveness-monitor.expiry-interval-ms)的一半 |
spark.yarn.scheduler.initial-allocation.interval | 200ms | 当有未处理的容器分配请求时,Spark应用master与YARN资源管理器间的心跳周期。不能大于spark.yarn.scheduler.heartbeat.interval-ms。如果未处理的容器分配请求持续存在,这个周期将会加倍,一直达到spark.yarn.scheduler.heartbeat.interval-ms。 |
spark.yarn.max.executor.failures | numExecutors * 2,至少3 | 当失败的执行器数大于spark.yarn.max.executor.failures,应用将被标记为失败 |
spark.yarn.historyServer.address | Spark 历史服务器地址(例如, host.com:18080),不需要包好http://。默认为空,历史服务器是可选的。当应用结束时,Spark资源管理器将应用的连接从资源管理器UI转换到Spark历史服务器UI。这个参数是可变的,可以在Spark运行期间调整。例如,如果历史服务器和YARN管理器运行在一个节点上,可以设置为`${hadoopconf-yarn.resourcemanager.hostname}:18080`. | |
spark.yarn.dist.archives | 逗号分隔的列表,用于存放从执行器工作目录提取的归档文件 |