原文地址:http://spark.apache.org/docs/latest/running-on-yarn.html
spark在0.6.0及以后的版本支持部署在Yarn模式下Hadoop nextgen
在Yarn模式下部署Spark
首先保证HADOOP_CONF_DIR和YARN_CONF_DIR 指向的文件夹包含hadoop集群的
配置文件。这些配置文件用于写HDFS文件和连接到Yarn资源管理器。在Yarn集群
上都使用和这个文件夹相同的配置文件。如果配置里面包含一些不被Yarn管理的
java系统属性或者环境变量,那么在Spark的应用程序的配置中也应该配置这些
信息(如驱动、执行器以及客户端模式下的AM)
这里有2种模式用来在Yarn模式下执行Spark应用程序。在集群模式下,Spark
驱动器运行在一个Yarn管理的集群的主程序的进程中,客户在应用初始化完成
后立刻启动。在客户端模式,驱动则运行在客户端进程中,主程序进程仅仅用来
向Yarn申请资源。
不同于单机模式和Mesos模式主节点是指定在--master
参数中,Yarn模式资源调度的地址
是在hadoop的配置文件中配置的。因此,它要设置--master
为yarn。
在集群模式下启动spark应用程序 $ ./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 \
lib/spark-examples*.jar \
10
如上所示在主程序上启动了一个Yarn客户端程序。SparkPi例子作为主应用的一个
子线程运行。控制台则定时去显示主程序的运行状况信息。直到程序运行完,
客户端才会退出。在调试应用程序一节,我们可以学习怎么看驱动器和执行器
的日志。
在客户端模式下启动应用程序和集群模式下相同,只需要把cluster替换成client
就可以了。如下所示在客户端模式下运行spark-shell: $ ./bin/spark-shell --master yarn --deploy-mode client
添加其他的jar包
在集群模式下,驱动运行在不同的机器上,因此在客户端上SparkContext.addJar的参数不会
引用到本地文件。为了使SparkContext.addJar在客户端有效,我们要在启动命令
中包含’–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
准备工作
运行Spark在Yarn模式下,需要一个支持Yarn模式二进制安装包。你可以在
下载页面下载。如果你要自己
编译,可以参考Building spark
配置
Yarn模式的大部分的配置与其它模式相同,也有部分特殊的配置。在Spark configuration提供了详细配置的信息供参考。
调试应用
在Yarn模式的属于中,执行器和主节点事运行在容器containers
中。当程序执行
完成后,Yarn有2种方式来管理容器的日志。如果设置日志的聚合参数(设置 yarn.log-aggregation-enable参数),容器日志将会拷贝到HDFS文件,并且删除
本地文件。我们可以通过yarn logs
来查看集群的日志。 yarn logs -applicationId <app ID>
这条命令能够打印指定应用的所有日志。你也可以通过HDFS shell 或者HDFS的
API来展示HDFS中的日志。你可以通过(yarn.nodemanager.remote-app-log-dir and yarn.nodemanager.remote-app-log-dir-suffix)等参数来查看日志文件的位置。
这些日志也可以在Spark Web UI中 Executors 页面得到但是你需要同时运行Spark
hisroty server和MapReduce history server并且配置yarn-site.xml中的yarn.log.server.url参数。在Spark history server UI 上的日志文件将会展示MapReduce history server中的所有日志。
当日志的聚合参数没有设定的时候,日志就保存在YARN_APP_LOGS_DIR参数指定的目录中,
一般是tmp/logs or $HADOOP_HOME/logs/userlogs,不过不同版本的hadoop可能不一样。
查看这些日志文件需要到每台主机的相应目录。子文件夹中通过 application
ID 和 container ID来命名组织这些文件。也可以在不运行MapReduce history server
的情况在Spark Web UI中 Executors 页面中查看日志。
再回头来看每个容器的启动环境,当增加yarn.nodemanager.delete.debug-delay-sec
到一个比较大的数值(例如:36000)的时候,我们就可以通过yarn.nodemanager.local-dirs
来进入容器都已经启动的节点上的程序的缓存了。这个文件夹包含启动每个
容器的脚本,jars和环境变量。这个过程有助于调试类路径的问题。(注意:
在集群上这样做需要管理员权限和重启所有节点管理器,因此这不适用于托管的集群)
下面是一些在主节点和执行器上使用log4j的配置项:
* 上传一个通常的log4j.properties文件,使用spark-submit
将文件添加在
参数--files
的文件中
* 添加-Dlog4j.configuration=<location of configuration file>
到 spark.driver.extraJavaOptions
(驱动器)或者spark.executor.extraJavaOptions
(执行器)。注意如果使用文件,那么file:
必须明确的使用,并且文件在
在所有的节点上都存在。
* 更新$SPARK_CONF_DIR/log4j.properties
后,它将自动上和其他配置一起上床。
注意其它的2项配置具有比这更高的优先级。
注意第一项,执行器和应用程序程序主节点共享同一个log4j的配置时,如果它们在一个节点
上运行将会导致一些问题。(例如:写同样的日志文件)
如果你想正确的显示和聚合日志文件可以考虑把spark.yarn.app.container
.log.dir参数加入到 log4j.properties文件中。例如: log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log
对于流程序而言,配置RollingFileAppender和设置 YARN
的日志文件路径可以避免大的日志文件导致的磁盘溢出,当然也可以通过YARN
的日志工具访问。
Spark Properties
属性名称 | 默认值 | 含义 |
spark.yarn.am.memory | 512m | 在客户端模式下Yarn应用程序使用的总的内存,字符格式和JVM内存格式一样(例如:512m,2g)。在集群模式下,使用 |
spark.driver.cores | 1 | 在集群模式下驱动器使用的内核数。由于驱动器和Yarn应用的主节点运行在同一个JVM上面,因此这个参数也控制Yarn应用的主节点的内核数。在客户端模式下面 spark.yarn.am.cores来控制Yarn应用的主节点的内核数 |
spark.yarn.am.cores | 1 | 在客户端模式下面 spark.yarn.am.cores来控制Yarn应用的主节点的内核数 |
spark.yarn.am.waitTime | 100s | 在集群模式下为Yarn应用的主节点等待SparkContext初始化的时间。在客户端模式,为驱动器连接Yarn应用的主节点的时间 |
spark.yarn.submit.file.replication | 默认的HDFS的副本数(默认值是3) | 应用程序上传文件到HDFS的副本的等级。包括这些包括Spark jar、APP jar和任何分布式缓存文件/档案 |
spark.yarn.preserve.staging.files | false | 设置为true则是保存过期的Spark jar、APP jar和任何分布式缓存文件/档,而不是删除它们 |
spark.yarn.scheduler.heartbeat.interval-ms | 3000 | Spark应用程序主节点连接到Yarn资源管理器的间隔(单位:ms)。它要大于Yarn失效时间间隔的1/2。也就是yarn.am.liveness-monitor.expiry-interval-ms |
spark.yarn.scheduler.initial-allocation.interval | 200ms | 当有容器等待分配需求的时候,Spark应用主节点连接到Yarn的资源管理器的间隔。它不能大于spark.yarn.scheduler.heartbeat.interval-ms。等待的间隔将会一直翻倍当等待的容器存在的时候,直到达到spark.yarn.scheduler.heartbeat.interval-ms。 |
spark.yarn.max.executor.failures | numExecutors * 2最小为3 | 在应用程序失败前,最大的执行器失败数 |
spark.yarn.historyServer.address | Spark history server的地址。例:host.com:18080。这地址不包括http:的前缀。由于Spark history server是可选服务,默认没有设置这个参数。当Spark application从ResourceManager UI 连接到Spark history server UI这个地址作用于ResourceManager UI。对于这个属性,可以由Spark在运行时使用Yarn参数替换。例如:如果 Spark history s与YARN Resource Manager server运行在同一个节点上,它可以设置${hadoopconf-yarn.resourcemanager.hostname}:18080 | |
spark.yarn.dist.archives | 逗号分隔的档案分配到每个执行器的工作文件夹 | |
spark.yarn.dist.files | 逗号分隔的文件放到每个执行器的工作文件夹 | |
spark.executor.instances | 2 | 执行器的数据。这个参数与spark.dynamicAllocation.enabled冲突。如果spark.executor.instances和spark.dynamicAllocation.enabled都设置时,spark.executor.instances作用而spark.dynamicAllocation.enabled失效. |
spark.yarn.executor.memoryOverhead | executorMemory * 0.10最小值 384 | 分配给每个执行器的off-heap内存(以兆字节为单位)。这是VM overheads, interned strings, other native overheads等的内存的总和。它随着执行器的大小改变(通常是6%~10%) |
spark.yarn.driver.memoryOverhead | driverMemory * 0.10最小值 384 | 分配给每个执行器的off-heap内存(以兆字节为单位)。这是VM overheads, interned strings, other native overheads等的内存的总和。它随着驱动器的大小改变(通常是6%~10%) |
spark.yarn.am.memoryOverhead | AM memory * 0.10最小值 384 | 与spark.yarn.driver.memoryOverhead含义相同,但是在客户端模式下 |
spark.yarn.am.port | (random) | Yarn应用程序主机监听的端口。在Yarn客户单模式下,它用于在网关上的Spark驱动器和Yarn应用程序主机之间交互。在Yarn集群模式下,当它被调度器后台关闭的时候,它作用于执行器的特征。 |
spark.yarn.queue | default | Yarn队列的名称,决定哪个应用被提交 |
spark.yarn.jar | 本地的Spark jar的地址,以防需要覆盖默认路径。 默认情况下, Spark on YARN使用本地安装的Spark jar包,但是Spark Jar也缓存在一个全局的HDFS上,这样就不用每次程序执行的时候分发了。指向一个HDFS的jar文件,可以参考hdfs:///some/path | |
spark.yarn.access.namenodes | 一组spark应用程序能够访问的HDFS namenodes,它们彼此间用逗号隔开。例如:spark.yarn.access.namenodes=hdfs://nn1.com:8032,hdfs://nn2.com:8032。Spark程序必须能够访问这些节点并且Kerberos正确的配置了它们(不管是在同一个区域还是同一个受信任的区域)。Spark是可以通过安全口令来访问的这些节点,因此Spark应用程序能够访问远端的HDFS集群。 | |
spark.yarn.appMasterEnv.[EnvironmentVariableName] | 增加一个通过EnvironmentVariableName 指定的环境变量在Yarn模式下主进程启动程序的时候。这样用户就可以设置多个环境变量了。在集群模式下它控制驱动器启动的环境变量,在客户端模式下它只能控制执行器的环境变量。 | |
spark.yarn.containerLauncherMaxThreads | 25 | 启动执行容器时Yarn应用程序能用的最大线程数 |
spark.yarn.am.extraJavaOptions | 在客户端模式下,给Yarn应用程序配置的一些额外的JVM选项。集群模式下用spark.driver.extraJavaOptions 代替。 | |
spark.yarn.am.extraLibraryPath | 客户端模式下添加一些指定的库文件路径 | |
spark.yarn.maxAppAttempts | yarn.resourcemanager.am.max-attempts in YARN | 提交程序的最大次数,不能大于Yarn配置里面设置的全局的最大次数 |
spark.yarn.am.attemptFailuresValidityInterval | AM失败跟踪的有效间隔。如果AM超过了这个间隔,AM失败数就会被重置。如果没有配置,这个选项不会作用。而且它只在hadoop2.6以上的版本有用。 | |
spark.yarn.submit.waitAppCompletion | true | 在Yarn集群模式下,控制客户端是否退出在程序完成前。设置为true的时候,客户端进程将一直存活并且报告程序状态。设置为false的时候,客户端在提交后就退出。 |
spark.yarn.am.nodeLabelExpression | 一个Yarn点标签表达式用来限制AM nodes的调度。2.6 以后的版本才支持这个属性,2.6以前则忽略。 | |
spark.yarn.executor.nodeLabelExpression | 一个Yarn点标签表达式用来限制执行器节点的调度。2.6 以后的版本才支持这个属性,2.6以前则忽略。 | |
spark.yarn.tags | 逗号分隔的字符串作为YARN application tags 出现在YARN ApplicationReports中,用于过滤查询YARN 应用。 | |
spark.yarn.keytab | 完整的keytab文件路径包括principal 制定的主体。keytab将拷贝通过分布式的缓存拷贝到引用程序的主节点,用于更新登陆票和代理口令。 | |
spark.yarn.principal | Principal 用在运行在安全的HDFS上登陆KDC | |
spark.yarn.config.gatewayPath | 一个有效路径在网管节点(Spark程序启动的节点),但是在集群中的其它节点上同样的资源在其它路径下。和park.yarn.config.replacementPath一起来支持集群的异构配置,那样Spark就可以正确的启动远端的进程了。这个路径包含一些环境变量。例如:如果网管节点的hadoop安装在/disk1/hadoop,但是通过Yarn导出在HADOOP_HOME的环境变量中。HADOOP_HOME设置成/disk1/hadoop能保证通过本地配置就可以启动远端的进程 | |
spark.yarn.config.replacementPath | 见上 | |
spark.yarn.security.tokens.${service}.enabled | true | 当按安全标志激活的时候,控制是否检索NO-HDFS服务的代理标签。默认情况下,所有代理标签都被服务(已经配置)检索,但是也有可能被停止当它与正在运行的程序冲突的时候。当前支持的服务有:hive,hbase |
注意事项
- 核心请求是否在调度决策中履行,依赖于调度的使用和配置。
- 在集群模式下,Spark执行器和驱动器使用的本地路径将会配置在Yarn中(Hadoop中配置yarn.nodemanager.local-dirs)。即使用户指定了spark.local.dir也会被忽略。在客户端模式下,Spark执行器使用的是Yarn中配置的本地路径,而Spark驱动器使用的是spark.local.dir配置的路径。这是因为只有Spark执行器才运行集群中,Spark驱动器则没有。
- –files和–archive参数支持类似于hadoop的#。例如:你指定–files localtest.txt#appSees.txt,就会更新本地文件localtest.txt文件到HDFS中的appSees.txt,你在程序运行在Yarn的时候就使用appSees.txt。
- 在集群模式下 –jars选项允许SparkContext.addJar 添加本地文件。但是如果你使用HDFS, HTTP, HTTPS, or FTP 就不需要使用了。