#运行实例
#./bin/run-example SparkPi 10
#./bin/spark-shell --master local[2]
#./bin/pyspark --master local[2]
#./bin/spark-submit examples/src/main/python/pi.py 10
#./bin/sparkR --master local[2]
#./bin/spark-submit examples/src/main/r/dataframe.R
#./bin/spark-shell ---scala
#./bin/pyspark ---python
#参考http://spark.apache.org/docs/latest/running-on-yarn.html
#$ ./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
#$ ./bin/spark-shell --master yarn --deploy-mode client
#$ ./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
为了让从YARN端访问Spark运行时JAR,你可以指定spark.yarn.archive
或spark.yarn.jars
。有关详细信息,请参阅Spark属性。如果两者都spark.yarn.archive
没有spark.yarn.jars
指定,Spark将创建一个包含所有jar文件的zip文件,$SPARK_HOME/jars
并将其上传到分布式缓存。
调试您的应用程序
在YARN术语中,执行者和应用程序主人在“容器”内部运行。YARN有两种处理应用程序完成后的容器日志的模式。如果打开日志聚合(使用yarn.log-aggregation-enable
配置),则将容器日志复制到HDFS并在本地计算机上删除。这些日志可以通过yarn logs
命令从群集的任何地方查看。
yarn logs -applicationId <app ID>
将从给定应用程序的所有容器中打印出所有日志文件的内容。您还可以使用HDFS外壳或API直接在HDFS中查看容器日志文件。他们所在的目录可以通过查看你的YARN配置(yarn.nodemanager.remote-app-log-dir
和yarn.nodemanager.remote-app-log-dir-suffix
)来找到。日志也可以在执行程序选项卡下的Spark Web UI上使用。你需要有两个星火历史服务器和MapReduce的历史服务器上运行,并配置yarn.log.server.url
在yarn-site.xml
正确。Spark历史记录服务器UI上的日志URL会将您重定向到MapReduce历史记录服务器以显示聚合日志。
当日志聚合未打开时,日志将保留在每台计算机上的本地YARN_APP_LOGS_DIR
,通常配置为/tmp/logs
或$HADOOP_HOME/logs/userlogs
取决于Hadoop版本和安装。查看容器的日志需要转到包含它们的主机并查看此目录。子目录按应用程序ID和容器ID组织日志文件。日志也可以在执行程序选项卡下的Spark Web UI上使用,不需要运行MapReduce历史记录服务器。
要查看每个容器的启动环境,请增加yarn.nodemanager.delete.debug-delay-sec
一个较大的值(例如36000
),然后通过yarn.nodemanager.local-dirs
启动容器的节点访问应用程序缓存。该目录包含启动脚本,JAR以及用于启动每个容器的所有环境变量。这个过程特别适用于调试类路径问题。(请注意,启用此功能需要对群集设置具有管理权限,并且需要重新启动所有节点管理器。因此,这不适用于托管群集)。
要为应用程序主或执行程序使用自定义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的日志实用程序访问日志。
要为应用程序主控程序和执行程序使用自定义的metrics.properties,请更新$SPARK_CONF_DIR/metrics.properties
文件。它会自动上传与其他配置,所以你不需要手动指定它--files
。
Spark属性
属性名称 | 默认 | 含义 |
---|---|---|
spark.yarn.am.memory |
512m |
用于客户端模式下的YARN Application Master的内存量,格式与JVM内存字符串(例如512m ,2g )相同。在集群模式下,spark.driver.memory 改为使用。
使用小写字母后缀,例如 |
spark.yarn.am.cores |
1 |
在客户端模式下用于YARN Application Master的核心数量。在集群模式下,spark.driver.cores 改为使用。 |
spark.yarn.am.waitTime |
100s |
在cluster 模式中,YARN Application Master等待SparkContext被初始化的时间。在client 模式中,YARN Application Master等待驱动程序连接的时间。 |
spark.yarn.submit.file.replication |
默认的HDFS复制(通常3 ) |
HDFS上传到应用程序的文件的HDFS复制级别。这些包括Spark jar,应用程序jar和任何分布式缓存文件/档案等。 |
spark.yarn.stagingDir |
当前用户在文件系统中的主目录 | 提交应用程序时使用的登台目录。 |
spark.yarn.preserve.staging.files |
false |
设置为true 在作业结束时保留分段文件(Spark jar,app jar,分布式缓存文件),而不是删除它们。 |
spark.yarn.scheduler.heartbeat.interval-ms |
3000 |
Spark应用程序主节点在YARN ResourceManager中心跳的时间间隔,以毫秒为单位。该值被限制在YARN的配置值的一半,即到期间隔 yarn.am.liveness-monitor.expiry-interval-ms 。 |
spark.yarn.scheduler.initial-allocation.interval |
200ms |
当存在未决的容器分配请求时,Spark应用程序主节点首先检测到YARN ResourceManager心跳的初始间隔。它不应该大于 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历史服务器的地址,例如host.com:18080 。地址不应该包含scheme(http:// )。由于历史记录服务器是可选服务,因此缺省设置为未设置。当Spark应用程序完成将应用程序从ResourceManager UI链接到Spark历史记录服务器UI时,该地址被赋予YARN ResourceManager。对于这个属性,YARN属性可以用作变量,并且在运行时由Spark替换。例如,如果Spark历史记录服务器与YARN ResourceManager在同一节点上运行,则可以将其设置为${hadoopconf-yarn.resourcemanager.hostname}:18080 。 |
spark.yarn.dist.archives |
(没有) | 逗号分隔的档案列表被提取到每个执行者的工作目录中。 |
spark.yarn.dist.files |
(没有) | 逗号分隔的文件列表将放置在每个执行器的工作目录中。 |
spark.yarn.dist.jars |
(没有) | 逗号分隔的jar列表将被放置在每个执行者的工作目录中。 |
spark.executor.instances |
2 |
静态分配的执行者数量。与此同时spark.dynamicAllocation.enabled ,最初的执行者将至少是这个大。 |
spark.yarn.executor.memoryOverhead |
executorMemory * 0.10,至少384 | 每个执行程序分配的堆内存量(以兆字节为单位)。这是内存,占VM的开销,interned字符串,其他本地开销等东西。这往往随着执行器的大小(通常6-10%)增长。 |
spark.yarn.driver.memoryOverhead |
驱动器内存* 0.10,最低384 | 群集模式下每个驱动程序分配的堆外存储器数量(以兆字节为单位)。这是内存,占VM的开销,interned字符串,其他本地开销等东西。这往往随着容器的大小(通常6-10%)。 |
spark.yarn.am.memoryOverhead |
AM存储器* 0.10,最小值为384 | 与spark.yarn.driver.memoryOverhead 客户端模式下的YARN Application Master 相同。 |
spark.yarn.am.port |
(随机) | YARN应用程序掌握端口。在YARN客户端模式下,用于在网关上运行的Spark驱动程序与在YARN上运行的YARN Application Master之间进行通信。在YARN集群模式下,它用于动态执行程序功能,在此处理来自调度程序后端的终止操作。 |
spark.yarn.queue |
default |
提交应用程序的YARN队列的名称。 |
spark.yarn.jars |
(没有) | 包含要分发到YARN容器的Spark代码的库的列表。默认情况下,YARN上的Spark将使用本地安装的Spark Jars,但Spark Jars也可以位于HDFS上全球可读的位置。这允许YARN将其缓存在节点上,以便每次应用程序运行时不需要分发它。例如,要指向HDFS上的jar,将此配置设置为hdfs:///some/path 。Globs是允许的。 |
spark.yarn.archive |
(没有) | 包含需要分发到YARN缓存的所需Spark jar的存档。如果设置,则此配置将替换,spark.yarn.jars 并且该存档将用于所有应用程序的容器中。归档文件应该在其根目录中包含jar文件。和前面的选项一样,存档也可以托管在HDFS上以加速文件分发。 |
spark.yarn.access.hadoopFileSystems |
(没有) | Spark应用程序要访问的安全Hadoop文件系统的逗号分隔列表。例如spark.yarn.access.hadoopFileSystems=hdfs://nn1.com:8032,hdfs://nn2.com:8032, webhdfs://nn3.com:50070 。Spark应用程序必须能够访问列出的文件系统,并且必须正确配置Kerberos以便能够访问它们(在相同领域或在可信领域)。Spark为每个文件系统获取安全令牌,以便Spark应用程序可以访问这些远程Hadoop文件系统。spark.yarn.access.namenodes 已弃用,请使用此代替。 |
spark.yarn.appMasterEnv.[EnvironmentVariableName] |
(没有) | 将指定的环境变量添加EnvironmentVariableName 到在YARN上启动的应用程序主进程。用户可以指定其中的多个并设置多个环境变量。在cluster 模式中,它控制着Spark驱动程序的环境,在client 模式中它只控制执行程序启动器的环境。 |
spark.yarn.containerLauncherMaxThreads |
25 |
YARN Application Master中用于启动执行程序容器的最大线程数。 |
spark.yarn.am.extraJavaOptions |
(没有) | 一系列额外的JVM选项,以客户端模式传递给YARN Application Master。在集群模式下,spark.driver.extraJavaOptions 改为使用。请注意,使用此选项设置最大堆大小(-Xmx)设置是非法的。最大堆大小设置可以使用spark.yarn.am.memory
|
spark.yarn.am.extraLibraryPath |
(没有) | 在客户端模式下启动YARN Application Master时,设置一个特殊的库路径。 |
spark.yarn.maxAppAttempts |
yarn.resourcemanager.am.max-attempts 在YARN |
提交申请的最大次数。它应该不大于YARN配置中的全局最大尝试次数。 |
spark.yarn.am.attemptFailuresValidityInterval |
(没有) | 定义AM故障跟踪的有效时间间隔。如果AM至少在定义的时间间隔内运行,则AM故障计数将被重置。如果未配置,则此功能未启用。 |
spark.yarn.executor.failuresValidityInterval |
(没有) | 定义执行器故障跟踪的有效时间间隔。超过有效期间的执行程序故障将被忽略。 |
spark.yarn.submit.waitAppCompletion |
true |
在YARN群集模式下,控制客户端是否等待退出,直到应用程序完成。如果设置为true ,则客户端进程将保持活动状态,报告应用程序的状态。否则,客户端进程将在提交后退出。 |
spark.yarn.am.nodeLabelExpression |
(没有) | 一个YARN节点标签表达式将限制节点AM的设置。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,该属性将被忽略。 |
spark.yarn.executor.nodeLabelExpression |
(没有) | 一个YARN节点标签表达式将限制节点执行者集合的安排。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,该属性将被忽略。 |
spark.yarn.tags |
(没有) | 以逗号分隔的字符串列表作为YARN ApplicationReports中出现的YARN应用程序标签传递,可用于在查询YARN应用程序时进行过滤。 |
spark.yarn.keytab |
(没有) | 包含上面指定的主体的keytab文件的完整路径。此密钥表将通过安全分布式缓存复制到运行YARN应用程序主控的节点,以定期更新登录票据和委托令牌。(也与“当地”大师合作) |
spark.yarn.principal |
(没有) | 在安全的HDFS上运行时使用Principal来登录到KDC。(也与“当地”大师合作) |
spark.yarn.config.gatewayPath |
(没有) | 在网关主机(启动Spark应用程序的主机)上有效的路径,但对于集群中其他节点中同一资源的路径可能有所不同。再加上 spark.yarn.config.replacementPath ,这是用来支持具有异构配置的群集,以便Spark能够正确启动远程进程。
替换路径通常将包含对由YARN导出的某个环境变量的引用(因此对Spark容器可见)。 例如,如果网关节点上安装了Hadoop库 |
spark.yarn.config.replacementPath |
(没有) | 看spark.yarn.config.gatewayPath 。 |
spark.yarn.security.credentials.${service}.enabled |
true |
控制在启用安全性时是否获取服务凭据。默认情况下,在配置这些服务时检索所有受支持服务的凭证,但如果与正在运行的应用程序有冲突,则可以禁用该行为。有关更多详细信息,请参阅[在安全群集中运行](运行在yarn.html#运行在安全群集中) |
spark.yarn.rolledLog.includePattern |
(没有) | Java正则表达式筛选与定义的包含模式和这些日志文件相匹配的日志文件将以滚动方式聚合。这将与YARN的滚动日志聚合一起使用,为了使YARN端的这个特性yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds 能够在yarn-site.xml中配置。此功能只能用于Hadoop 2.6.4+。Spark log4j appender需要更改为使用FileAppender或另一个可以处理正在运行的文件的appender。根据在log4j配置中配置的文件名(如spark.log),用户应该设置正则表达式(spark *)以包含所有需要聚合的日志文件。 |
spark.yarn.rolledLog.excludePattern |
(没有) | Java正则表达式来过滤与定义的排除模式相匹配的日志文件,这些日志文件不会以滚动方式聚合。如果日志文件名称与包含和排除模式都匹配,则最终将排除该文件。 |
重要笔记
- 核心请求在调度决策中是否得到遵守取决于哪个调度程序正在使用以及如何配置。
- 在
cluster
模式下,Spark执行程序和Spark驱动程序使用的本地目录将是为YARN(Hadoop YARN configyarn.nodemanager.local-dirs
)配置的本地目录。如果用户指定spark.local.dir
,它将被忽略。在client
模式中,Spark执行程序将使用为YARN配置的本地目录,而Spark驱动程序将使用在其中定义的目录spark.local.dir
。这是因为Spark驱动程序不能在client
模式下的YARN集群上运行,只有Spark执行程序会这样做。 - 在
--files
和--archives
选项支持类似于Hadoop的该#指定文件名。例如,你可以指定:--files localtest.txt#appSees.txt
这将把你本地命名的文件上传localtest.txt
到HDFS中,但是这个文件会被链接到名字appSees.txt
,并且你的应用程序应该使用这个名字appSees.txt
来在YARN上运行时引用它。 - 如果使用本地文件并在模式下运行,该
--jars
选项允许该SparkContext.addJar
功能起作用cluster
。如果您使用HDFS,HTTP,HTTPS或FTP文件,则不需要使用它。
在安全集群中运行
正如安全性所述,Kerberos用于安全的Hadoop集群,以对与服务和客户端关联的主体进行身份验证。这允许客户提出这些认证服务的请求; 向经认证的校长授予权利的服务。
Hadoop服务发布hadoop令牌来授予对服务和数据的访问权限。客户必须首先获取他们将访问的服务的标记,并将其与在YARN集群中启动的应用程序一起传递。
对于Spark应用程序来与任何Hadoop文件系统(例如hdfs,webhdfs等),HBase和Hive进行交互,它必须使用启动应用程序的用户的Kerberos凭据来获取相关的令牌 - 也就是,将成为Spark应用程序的启动。
这通常在启动时完成:在一个安全的集群中,Spark将自动获取集群的默认Hadoop文件系统的标记,并可能为HBase和Hive获取标记。
如果HBase在类路径中,则HBase令牌将被获得,HBase配置声明应用程序是安全的(即hbase-site.xml
设置hbase.security.authentication
为kerberos
)并且spark.yarn.security.credentials.hbase.enabled
未设置为false
。
同样,如果Hive位于类路径中,则会获得Hive标记,其配置包含元数据存储的URI "hive.metastore.uris
,并且spark.yarn.security.credentials.hive.enabled
未设置为false
。
如果应用程序需要与其他安全的Hadoop文件系统进行交互,则在启动时必须明确请求访问这些群集所需的令牌。这是通过将它们列在spark.yarn.access.hadoopFileSystems
属性中来完成的。
spark.yarn.access.hadoopFileSystems hdfs://ireland.example.org:8020/,webhdfs://frankfurt.example.org:50070/
Spark通过Java服务机制支持与其他安全感知服务的集成(请参阅参考资料 java.util.ServiceLoader
)。为此,org.apache.spark.deploy.yarn.security.ServiceCredentialProvider
Spark的实现应该可以通过将其名称列在jar META-INF/services
目录中相应的文件中来使用 。这些插件可以通过设置来禁用 spark.yarn.security.credentials.{service}.enabled
到false
,这里{service}
是证书提供商的名称。
配置外部随机服务
要NodeManager
在您的YARN群集中的每个群集上启动Spark Shuffle服务,请按照以下说明进行操作:
- 使用YARN配置文件构建Spark 。如果您使用的是预打包发行版,请跳过此步骤。
- 找到
spark-<version>-yarn-shuffle.jar
。$SPARK_HOME/common/network-yarn/target/scala-<version>
如果你正在自己构建Spark,并且在yarn
使用发行版的情况下, 这应该在下面 。 - 将此jar添加到
NodeManager
群集中所有s 的类路径中。 - 在
yarn-site.xml
每个节点上,添加spark_shuffle
到yarn.nodemanager.aux-services
,然后设置yarn.nodemanager.aux-services.spark_shuffle.class
为org.apache.spark.network.yarn.YarnShuffleService
。 -
NodeManager's
通过设置YARN_HEAPSIZE
(缺省etc/hadoop/yarn-env.sh
为1000)来增加堆大小,以避免在混洗期间垃圾收集问题。 - 重新启动
NodeManager
群集中的所有设备。
在YARN上运行shuffle服务时,可以使用以下额外的配置选项:
属性名称 | 默认 | 含义 |
---|---|---|
spark.yarn.shuffle.stopOnFailure |
false |
是否在Spark Shuffle Service初始化失败时停止NodeManager。这可以防止在Spark Shuffle服务未运行的NodeManager上运行容器导致应用程序失败。 |
使用Apache Oozie启动您的应用程序
Apache Oozie可以启动Spark应用程序作为工作流程的一部分。在安全集群中,启动的应用程序将需要相关的令牌来访问集群的服务。如果Spark是通过keytab启动的,这是自动的。但是,如果Spark没有keytab,那么建立安全的责任必须交给Oozie。
可以在Oozie网站 的特定版本文档的“身份验证”部分找到有关为安全集群配置Oozie和获取作业凭证的详细信息。
对于Spark应用程序,必须为Oozie设置Oozie工作流,以请求应用程序需要的所有令牌,其中包括:
- YARN资源管理器。
- 本地Hadoop文件系统。
- 任何用作I / O源或目的地的远程Hadoop文件系统。
- 配置单元 - 如果使用。
- 使用HBase -if。
- YARN时间轴服务器,如果应用程序与此交互。
为了避免Spark试图获取Hive,HBase和远程HDFS令牌,必须将Spark配置设置为禁用令牌收集。
Spark配置必须包含以下行:
spark.yarn.security.credentials.hive.enabled false spark.yarn.security.credentials.hbase.enabled false
配置选项spark.yarn.access.hadoopFileSystems
必须是未设置的。
解决Kerberos问题
调试Hadoop / Kerberos问题可能是“困难的”。一个有用的技术是通过设置HADOOP_JAAS_DEBUG
环境变量来启用Hadoop中的Kerberos操作的额外日志记录。
bash export HADOOP_JAAS_DEBUG=true
JDK的类可以被配置为经由系统属性来使他们的Kerberos和SPNEGO / Rest认证的额外的记录sun.security.krb5.debug
和sun.security.spnego.debug=true
-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true
所有这些选项都可以在Application Master中启用:
spark.yarn.appMasterEnv.HADOOP_JAAS_DEBUG true spark.yarn.am.extraJavaOptions -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true
最后,如果日志级别org.apache.spark.deploy.yarn.Client
设置为DEBUG
,则日志将包括获取的所有令牌的列表以及其到期的详细信息
使用Spark历史记录服务器来替换Spark Web UI
当应用程序UI被禁用时,可以使用Spark History Server应用程序页面作为运行应用程序的跟踪URL。这对于安全的群集可能是需要的,或者减少Spark驱动程序的内存使用量。要通过Spark历史记录服务器设置跟踪,请执行以下操作:
- 在应用程序方面,设置
spark.yarn.historyServer.allowTracking=true
Spark的配置。如果应用程序的UI被禁用,这将告诉Spark使用历史服务器的URL作为跟踪URL。 - 在Spark历史记录服务器上,添加
org.apache.spark.deploy.yarn.YarnProxyRedirectFilter
到spark.ui.filters
配置中的过滤器列表。
请注意,历史记录服务器信息可能不是应用程序状态的最新信息。