在0.6.0版中,Spark添加了对在YARN(Hadoop NextGen)上运行的支持,并在后续发行版中进行了改进。
默认情况下,Spark中的安全性处于关闭状态。这可能意味着您默认情况下容易受到攻击。在运行Spark之前,请参阅Spark安全性和本文档中的特定安全性部分。
确保HADOOP_CONF_DIR或YARN_CONF_DIR指向包含Hadoop集群的(客户端)配置文件的目录。这些配置用于写入HDFS并连接到YARN ResourceManager。此目录中包含的配置将分发到YARN群集,以便应用程序使用的所有容器都使用相同的配置。如果配置引用不是由YARN管理的Java系统属性或环境变量,则还应该在Spark应用程序的配置(在客户端模式下运行时的驱动程序,执行程序和AM)中进行设置。
有两种部署模式可用于在YARN上启动Spark应用程序。在cluster模式下,Spark驱动程序在由YARN在群集上管理的应用程序主进程中运行,并且客户端可以在启动应用程序后消失。在client模式下,驱动程序在客户端进程中运行,而应用程序主控仅用于从YARN请求资源。
与Spark支持的其他集群管理器(在--master 参数中指定了主服务器的地址)不同,在YARN模式下,ResourceManager的地址是从Hadoop配置中提取的。因此,--master参数为yarn。
要以cluster模式启动Spark应用程序:
$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [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客户端程序,该程序启动了默认的Application Master。然后,SparkPi将作为Application Master的子线程运行。客户端将定期轮询Application Master以获取状态更新,并将其显示在控制台中。应用程序完成运行后,客户端将退出。请参阅下面的“调试应用程序”部分,以了解如何查看驱动程序和执行程序日志。
要以client模式启动Spark应用程序,请执行相同的操作,但替换cluster为client。下面显示了如何spark-shell在client模式下运行:
$ ./bin/spark-shell --master yarn --deploy-mode client
在cluster模式下,驱动程序与客户端运行在不同的计算机上,因此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
在YARN上运行Spark需要使用YARN支持构建的Spark二进制分发版。二进制发行版可以从项目网站的下载页面下载。要自己构建Spark,请参阅构建Spark。
要使YARN端可以访问Spark运行时jar,可以指定spark.yarn.archive或spark.yarn.jars。有关详细信息,请参阅Spark属性。如果既未指定也spark.yarn.archive未spark.yarn.jars指定,Spark将创建一个包含所有jar的zip文件,$SPARK_HOME/jars并将其上传到分布式缓存。
YARN上的Spark的大多数配置与其他部署模式相同。有关这些的更多信息,请参见配置页面。这些是特定于YARN上Spark的配置。
用YARN术语来说,执行者和应用程序主管在“容器”内部运行。在应用程序完成之后,YARN有两种处理容器日志的模式。如果启用了日志聚合(使用yarn.log-aggregation-enable配置),则将容器日志复制到HDFS并在本地计算机上删除。可以使用yarn logs命令从群集的任何位置查看这些日志。
yarn logs -applicationId
将从给定应用程序的所有容器中打印出所有日志文件的内容。您还可以使用HDFS Shell或API在HDFS中直接查看容器日志文件。通过查看您的YARN配置(yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix)可以找到它们所在的目录。日志也可在Spark Web UI的“执行程序”选项卡下使用。您需要同时运行Spark历史记录服务器和MapReduce历史记录服务器并yarn.log.server.url进行yarn-site.xml正确配置。Spark历史记录服务器UI上的日志URL会将您重定向到MapReduce历史记录服务器以显示聚合的日志。
如果未启用日志聚合,则日志将在本地的每台计算机上本地保留YARN_APP_LOGS_DIR,通常配置为Hadoop的版本和安装,/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配置,这可能在它们在同一节点上运行时引起问题(例如,尝试写入同一日志文件)。
如果您需要引用适当的位置以将日志文件放入YARN中,以便YARN可以正确显示和聚合它们,请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 |
的存储器的量在客户机模式中使用用于纱线的应用万事达,在相同的格式JVM存储器串(例如512m,2g)。在群集模式下,请spark.driver.memory改用。 使用小写字母后缀,例如k,m,g,t,和p,为kibi-,mebi-,gibi-,tebi-和pebibytes,分别。 |
spark.yarn.am.cores |
1 |
客户端模式下用于YARN Application Master的核心数。在群集模式下,请spark.driver.cores改用。 |
spark.yarn.am.waitTime |
100s |
仅在cluster模式下使用。YARN Application Master等待SparkContext初始化的时间。 |
spark.yarn.submit.file.replication |
默认的HDFS复制(通常为3) |
上传到应用程序的HDFS中的文件的HDFS复制级别。其中包括Spark jar,app 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。该地址不应包含方案(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.yarn.dist.forceDownloadSchemes |
(none) |
以逗号分隔的方案列表,其资源将在添加到YARN的分布式缓存之前先下载到本地磁盘。适用于YARN服务不支持Spark支持的方案(如http,https和ftp)或本地YARN客户端的类路径中需要的jar的情况。表示通配符“ *”以下载所有方案的资源。 |
spark.executor.instances |
2 |
静态分配的执行程序数。使用spark.dynamicAllocation.enabled,初始执行器集至少会这么大。 |
spark.yarn.am.memoryOverhead |
AM内存* 0.10,最少384 |
与相同spark.driver.memoryOverhead,但用于客户端模式下的YARN Application Master。 |
spark.yarn.queue |
default |
提交应用程序的YARN队列的名称。 |
spark.yarn.jars |
(没有) |
包含要分发到YARN容器的Spark代码的库列表。默认情况下,YARN上的Spark将使用本地安装的Spark jar,但是Spark jar也可以位于HDFS上的世界可读位置。这使YARN可以将其缓存在节点上,因此不需要在每次运行应用程序时将其分发。例如,要指向HDFS上的jar,请将此配置设置为hdfs:///some/path。允许使用小球。 |
spark.yarn.archive |
(没有) |
包含所需的Spark jar的归档文件,用于分发到YARN缓存。如果设置,将替换此配置,spark.yarn.jars并且在所有应用程序容器中使用存档。归档文件应在其根目录中包含jar文件。与上一个选项一样,存档文件也可以托管在HDFS上,以加快文件分发速度。 |
spark.yarn.appMasterEnv.[EnvironmentVariableName] |
(没有) |
将指定的环境变量添加EnvironmentVariableName到在YARN上启动的Application Master进程中。用户可以指定多个,并设置多个环境变量。在cluster模式下,它控制Spark驱动程序的环境,在client模式下,它仅控制执行程序启动器的环境。 |
spark.yarn.containerLauncherMaxThreads |
25 |
YARN Application Master中用于启动执行程序容器的最大线程数。 |
spark.yarn.am.extraJavaOptions |
(没有) |
在客户端模式下传递给YARN Application Master的一串额外的JVM选项。在群集模式下,请spark.driver.extraJavaOptions改用。请注意,使用此选项设置最大堆大小(-Xmx)设置是非法的。最大堆大小设置可以使用spark.yarn.am.memory |
spark.yarn.am.extraLibraryPath |
(没有) |
设置在客户端模式下启动YARN Application Master时要使用的特殊库路径。 |
spark.yarn.maxAppAttempts |
yarn.resourcemanager.am.max-attempts 在纱 |
提交申请的最大尝试次数。它不应大于YARN配置中的最大最大尝试次数。 |
spark.yarn.am.attemptFailuresValidityInterval |
(没有) |
定义AM故障跟踪的有效间隔。如果AM已经运行了至少已定义的时间间隔,则AM故障计数将被重置。如果未配置,则不会启用此功能。 |
spark.yarn.executor.failuresValidityInterval |
(没有) |
定义执行程序失败跟踪的有效间隔。超过有效间隔的执行器故障将被忽略。 |
spark.yarn.submit.waitAppCompletion |
true |
在YARN群集模式下,控制客户端是否等待退出直到应用程序完成。如果设置为true,则客户端进程将保持活动状态,报告应用程序的状态。否则,客户端进程将在提交后退出。 |
spark.yarn.am.nodeLabelExpression |
(没有) |
将调度限制节点AM集合的YARN节点标签表达式。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,将忽略此属性。 |
spark.yarn.executor.nodeLabelExpression |
(没有) |
将调度限制节点执行程序集的YARN节点标签表达式。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,将忽略此属性。 |
spark.yarn.tags |
(没有) |
将以逗号分隔的字符串列表作为YARN ApplicationReports中出现的YARN应用程序标签传递,可用于查询YARN应用程序时进行过滤。 |
spark.yarn.config.gatewayPath |
(没有) |
在网关主机(启动Spark应用程序的主机)上有效的路径,但对于集群中其他节点中相同资源的路径可能会有所不同。与结合使用 spark.yarn.config.replacementPath,它用于支持具有异构配置的集群,以便Spark可以正确启动远程进程。 替换路径通常将包含对YARN导出的某些环境变量的引用(因此对Spark容器可见)。 例如,如果网关节点在上安装了Hadoop库/disk1/hadoop,并且YARN将Hadoop安装的位置作为HADOOP_HOME 环境变量导出 ,则将该值设置为/disk1/hadoop,并将替换路径设置为, $HADOOP_HOME将确保用于启动远程进程的路径正确引用本地YARN配置。 |
spark.yarn.config.replacementPath |
(没有) |
请参阅spark.yarn.config.gatewayPath。 |
spark.yarn.rolledLog.includePattern |
(没有) |
Java Regex过滤与定义的包含模式匹配的日志文件,这些日志文件将以滚动方式聚合。这将与YARN的滚动日志聚合一起使用,要在YARN端启用此功能, yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds应在yarn-site.xml中进行配置。此功能只能与Hadoop 2.6.4+一起使用。需要将Spark log4j附加程序更改为使用FileAppender或另一个附加程序,该附加程序可以在运行时处理要删除的文件。基于在log4j配置中配置的文件名(例如spark.log),用户应将正则表达式(spark *)设置为包括所有需要汇总的日志文件。 |
spark.yarn.rolledLog.excludePattern |
(没有) |
Java Regex用于过滤与定义的排除模式匹配的日志文件,并且这些日志文件不会以滚动方式聚合。如果日志文件名与包含和排除模式均匹配,则该文件最终将被排除。 |
spark.yarn.blacklist.executor.launch.blacklisting.enabled |
假 |
启用对具有YARN资源分配问题的节点的黑名单的标记。可以通过配置黑名单的错误限制 spark.blacklist.application.maxFailedExecutorsPerNode。 |
spark.yarn.metrics.namespace |
(没有) |
AM指标报告的根名称空间。如果未设置,则使用YARN应用程序ID。 |
“ 安全性”页面涵盖了Spark中的标准Kerberos支持。
在YARN模式下,访问Hadoop文件系统时,Spark将自动获取以下内容的委托令牌:
如果应用程序需要与其他安全的Hadoop文件系统进行交互,则需要在启动时将其URI明确提供给Spark。通过在spark.yarn.access.hadoopFileSystems属性中列出它们来完成此操作 ,如下面的配置部分所述。
YARN集成还使用Java服务机制来支持自定义委托令牌提供者(请参阅参考资料java.util.ServiceLoader)。org.apache.spark.deploy.yarn.security.ServiceCredentialProvider通过在jar的META-INF/services目录中相应文件中列出其名称,可以使Spark的实现 可用。通过将设置spark.security.credentials.{service}.enabled为 false,可以单独禁用这些提供程序,其中{service}凭证提供程序的名称。
物业名称 |
默认 |
含义 |
spark.yarn.keytab |
(没有) |
包含上面指定的主体的密钥表的文件的完整路径。该密钥表将通过YARN分布式缓存复制到运行YARN Application Master的节点,并将用于定期更新登录凭单和委托令牌。等效于--keytab命令行参数。 |
spark.yarn.principal |
(没有) |
在安全群集上运行时用于登录KDC的主体。等效于 --principal命令行参数。 |
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.kerberos.relogin.period |
1m |
多久检查一次是否应更新kerberos TGT。该值应设置为短于TGT更新周期(如果未启用TGT更新,则为TGT生存期)。对于大多数部署,默认值应该足够。 |
调试Hadoop / Kerberos问题可能很“困难”。一种有用的技术是通过设置HADOOP_JAAS_DEBUG 环境变量来在Hadoop中启用Kerberos操作的额外日志记录。
export HADOOP_JAAS_DEBUG=true
可以将JDK类配置为通过系统属性sun.security.krb5.debug 和属性来启用其Kerberos和SPNEGO / REST身份验证的额外日志记录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,则该日志将包含所有获得的令牌的列表以及它们的有效期详细信息
要NodeManager在YARN群集中的每个群集上启动Spark Shuffle服务,请按照以下说明进行操作:
在YARN上运行随机播放服务时,可以使用以下附加配置选项:
物业名称 |
默认 |
含义 |
spark.yarn.shuffle.stopOnFailure |
false |
Spark Shuffle Service的初始化失败时是否停止NodeManager。这样可以防止由于未运行Spark Shuffle服务的NodeManager上运行容器而导致应用程序故障。 |
Apache Oozie可以在工作流程中启动Spark应用程序。在安全的群集中,启动的应用程序将需要相关令牌来访问群集的服务。如果使用密钥表启动Spark,则这是自动的。但是,如果要在没有密钥表的情况下启动Spark,则必须将设置安全性的职责移交给Oozie。
在特定发行版文档的“身份验证”部分的Oozie网站上可以找到为安全群集配置Oozie以及获取作业凭据的详细信息。
对于Spark应用程序,必须为Oozie设置Oozie工作流,以请求该应用程序需要的所有令牌,包括:
为了避免Spark尝试(然后失败)获取Hive,HBase和远程HDFS令牌,必须将Spark配置设置为禁用服务的令牌收集。
Spark配置必须包括以下几行:
spark.security.credentials.hive.enabled false
spark.security.credentials.hbase.enabled false
spark.yarn.access.hadoopFileSystems必须取消配置选项。
禁用应用程序UI时,可以将Spark History Server应用程序页面用作运行应用程序的跟踪URL。在安全群集上或减少Spark驱动程序的内存使用量可能是理想的。要通过Spark History Server设置跟踪,请执行以下操作:
请注意,历史记录服务器信息可能不是与应用程序状态有关的最新信息。