天天看点

《Spark官方文档》在YARN上运行Spark

spark在 0.6.0版本后支持在yarn(hadoop nextgen)上运行,并且在后续版本中不断改进。

首先,确认 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 应用:

例如:

上面的命令启动了一个yarn端程序,调用默认的应用master,sparkpi作为master的子线程运行。客户端定期连向应用master更新并在console中显示状态。当应用结束后客户端进程也会退出。在后面的“调试应用”小节,将介绍如何查看驱动器和执行器的日志。

同样可以在yarn客户端模式下运行spark应用,只需要将“yarn-cluster”换成“yarn-client”

在yarn-culster模式下,驱动器和客户端在不同的集群上运行,所以在保存在客户端上文件不能通过sparkcontext.addjar加入到运行沙盒中。为了让sparkcontext.addjar能够使用客户端上的这些文件,需要把他们通过–jar选项加入到启动命令中。

在yarn上运行spark需要一个支持yarn的spark二进制包,这个包可以在spark项目网站上下载。

spark在yarn上的大部分配置项和其他部署模式相同,可以在后面配置项一节获得更多关于此的信息,这些配置仅用于在yarn上运行spark。

用yarn术语来说,执行器、应用master都在容器(container)内运行。在应用结束后yarn会采用2种方式处理容器日志。如果开启了日志归集(yarn.log-aggregation-enable),日志将被拷到hdfs上,本地文件将被删除。这些日志可以通过’yarn logs’命令在集群的任何节点查看。

上面的命令会打印出应用所有容器的日志文件内容。当然也可以直接在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日志工具访问。

但是下列是在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

在终端模式下,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

逗号分隔的列表,用于存放从执行器工作目录提取的归档文件