转载请注明出处,谢谢合作~
在 Yarn 上运行 Spark
- 安全机制(Security)
- 在 Yarn 上启动 Spark(Launching Spark on YARN)
- 添加额外依赖(Adding Other JARs)
- 准备工作(Preparations)
- 配置参数(Configuration)
- 调试应用程序(Debugging your Application)
- Spark 属性(Spark Properties)
- SHS 自定义 executor 日志 URL 可用的匹配模式(Available patterns for SHS custom executor log URL)
- 资源分配和配置概述(Resource Allocation and Configuration Overview)
- 重要事项(Important notes)
- Kerberos(Kerberos)
- Yarn 的 Kerberos 配置(YARN-specific Kerberos Configuration)
- Kerberos 疑难解答(Troubleshooting Kerberos)
- 配置 External Shuffle Service(Configuring the External Shuffle Service)
- 使用 Apache Oozie 启动应用程序(Launching your application with Apache Oozie)
- 使用 Spark History Server 代替 Spark Web 界面(Using the Spark History Server to replace the Spark Web UI)
对 Yarn(YARN (Hadoop NextGen))的支持自 Spark 0.6.0 开始,并在之后的版本中持续改进。
安全机制
Spark 中的安全机制默认是关闭的,这意味着在默认情况下你的 Spark 系统很容易收到攻击。请在运行 Spark 之前阅读 Spark Security 文档和本文档中的安全章节。
在 Yarn 上启动 Spark
请确保环境变量 HADOOP_CONF_DIR
或者 YARN_CONF_DIR
指向了包含 Hadoop 集群配置文件(客户端)的目录,这些配置用来写入 HDFS 以及连接 Yarn 的 ResourceManager。目录中包含的配置文件将会分发到 Yarn 集群中,所有应用程序使用的容器都会使用相同的配置文件。
如果这些配置涉及的 Java 系统属性或者环境变量不是由 Yarn 管理的,还应该将它们加入到 Spark 应用程序的配置参数中(driver,executor,和 client
模式下的 AM)。
将应用程序提交到 Yarn 上有两种模式。在 cluster
模式下,Spark 的 driver 端运行在由 Yarn 管理的应用程序管理器(application master,AM)进程中,客户端可以在应用程序初始化完成之后退出。在 client
模式下,driver 运行在客户端进程中,AM 只用来向 Yarn 申请资源。
不像其他 Spark 支持的集群管理器那样需要在参数 --master
中传递集群地址,在 Yarn 模式下,ResourceManager 的地址会从 Hadoop 配置文件中获取。所以参数 --master
的值为 yarn
。
以 cluster
模式提交 Spark 应用程序:
$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] [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 \
examples/jars/spark-examples*.jar \
10
上面的示例启动一个 Yarn 客户端程序,启动默认的 AM。SparkPi 将会以 AM 的子线程的方式运行。客户端程序会定时向 AM 获取状态数据并展示在控制台。客户端程序会在任务运行完成之后退出。如何查看 driver 和 executor 日志参见「调试应用程序」章节。
以 client
模式启动 Spark 应用程序和上面基本一样,只是需要将 cluster
替换为 client
。下面的命令展示了如何在 client
模式下运行 spark-shell
:
$ ./bin/spark-shell --master yarn --deploy-mode client
添加其他依赖
在 cluster
模式下,driver 和客户端运行在不同的节点上,所以 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 二进制版本,可以从项目网站的下载页 downloads page 下载。如果需要自行编译,参见 Building Spark。
让 Yarn 可以访问 Spark 运行时依赖,需要指定参数 spark.yarn.archive
或者 spark.yarn.jars
。详情参见 Spark Properties。如果 spark.yarn.archive
和 spark.yarn.jars
都没有指定,Spark 会将 $SPARK_HOME/jars
下的依赖压缩成一个 zip 文件上传到分布式缓存目录中。
配置参数
在 Yarn 模式下运行的大部分配置参数与其他的部署模式别无二致。详情参见 configuration page,其中包含了 Yarn 模式下特定的配置参数。
调试应用程序
在 Yarn 的术语中,executor 和 AM 都运行在「容器」中。Yarn 有两种模式处理应用程序运行完成之后的日志。如果开启了日志聚合功能(由参数 yarn.log-aggregation-enable
控制),日志会被拷贝到 HDFS,之后删除本地机器上的日志。这些日志可以在集群中的任何一个节点上通过 yarn logs
命令查看。
yarn logs -applicationId
该命令会打印出指定应用程序所有容器中的日志。还可以直接通过 HDFS shell 或者 API 查看容器日志,可以通过 Yarn 的配置文件找到这些日志的存储目录(yarn.nodemanager.remote-app-log-dir
和 yarn.nodemanager.remote-app-log-dir-suffix
)。日志还可以从 Spark 应用程序界面上的 executor Tab 页面查看,需要同时运行 Spark history server 和 MapReduce history server,并在 yarn-site.xml
文件中配置好参数 yarn.log.server.url
。Spark history server 界面上的日志 URL 会重定向到 MapReduce history server,来展示聚合后的日志。
如果日志聚合没有开启,日志将会保留在容器所在节点的 YARN_APP_LOGS_DIR
目录下,通常是 /tmp/logs
或者 $HADOOP_HOME/logs/userlogs
,取决于 Hadoop 的版本和部署。查看日志需要到相应的节点上的日志目录中找到日志文件。子目录通过应用程序 ID 和容器 ID 组织日志文件。在不运行 MapReduce history server 的情况下,日志还可以从 Spark 界面上的 executor Tab 页面查看。
如果需要回顾容器的运行环境,需要将参数 yarn.nodemanager.delete.debug-delay-sec
设置为一个较大的值(例如,36000
),之后在容器运行的节点上通过参数 yarn.nodemanager.local-dirs
配置的目录访问应用程序缓存文件。该目录包含了容器启动脚本,依赖库,以及启动容器使用的环境变量。这种方式尤其适用于调试程序的 classpath。(注意,开启该功能需要集群管理员权限,并重启所有的 NodeManager。所以,不适用于托管集群。)
如果需要为 executor 或者 AM 指定自定义的 log4j 配置文件,有以下几种方式:
- 通过
spark-submit
脚本的--files
选项上传一份自定义的log4j.properties
文件。 - 在参数
spark.driver.extraJavaOptions
(driver 端)或者spark.executor.extraJavaOptions
(executor 端)中添加-Dlog4j.configuration=
。注意,如果使用单独的文件,必须显示指定file:
协议,而且文件必须存在于集群上的每个节点中。 - 更新
$SPARK_CONF_DIR/log4j.properties
文件,它会和其他配置文件一起被上传。注意,如果使用了多种方式,前面两种方式拥有更高的优先级。
注意,对于第一种方式,所有的 executor 和 AM 会共享同一份 log4j 配置文件,当它们运行在一个节点上时可能会造成不便(例如,executor 和 AM 会尝试去写同一个日志文件)。
为了让 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 的日志工具进行访问。
如果应用程序需要为 AM 和 executor 指定自定义的 metrics.properties
文件,请更新 $SPARK_CONF_DIR/metrics.properties
文件,它会和其他配置文件一起被上传,所以不需要通过 --files
选项手动指定。
Spark 属性
属性名称 | 默认值 | 含义 | 起始版本 |
---|---|---|---|
spark.yarn.am.memory |
512m |
在 client 模式下 Yarn AM 的内存用量,格式与 JVM 内存字符串形式相同(例如,512m ,2g )。在 cluster 模式下,请使用 spark.driver.memory 代替。请使用小写后缀 k ,m ,g ,t 和 p ,分别代表 KB,MB,GB,TB 和 PB。 |
1.3.0 |
spark.yarn.am.resource.{resource-type}.amount |
(none) |
在 client 模式下 Yarn AM 的资源用量。在 cluster 模式下,请使用 spark.yarn.driver.resource. 代替。请注意该功能只适用于 YARN 3.0 及以上版本,参见 Yarn 资源模型文档 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample。从 Yarn 申请 GPU 资源请使用:spark.yarn.am.resource.yarn.io/gpu.amount |
3.0.0 |
spark.yarn.driver.resource.{resource-type}.amount |
(none) |
在 cluster 模式下 Yarn AM 的资源用量。请注意该功能只适用于 YARN 3.0 及以上版本,参见 Yarn 资源模型文档 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample。从 Yarn 申请 GPU 资源请使用:spark.yarn.driver.resource.yarn.io/gpu.amount |
3.0.0 |
spark.yarn.executor.resource.{resource-type}.amount |
(none) |
每个 executor 的资源用量。请注意该功能只适用于 YARN 3.0 及以上版本,参见 Yarn 资源模型文档 https://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarn-site/ResourceModel.htmlExample。从 Yarn 申请 GPU 资源请使用:spark.yarn.executor.resource.yarn.io/gpu.amount |
3.0.0 |
spark.yarn.am.cores |
1 |
在 client 模式下 Yarn AM 使用的核数。在 cluster 模式下,请使用 spark.driver.cores 代替。 |
1.3.0 |
spark.yarn.am.waitTime |
100s |
只在 cluster 模式下生效,Yarn AM 等待 SparkContext 初始化完成的超时时间。 |
1.3.0 |
spark.yarn.submit.file.replication |
HDFS 默认副本系数(通常是 3) | 应用程序上传到 HDFS 的文件的副本系数,包括 Spark Jar 依赖,应用 Jar 文件,和分布式缓存文件。 | 0.8.1 |
spark.yarn.stagingDir |
文件系统中当前用户的家目录 | 提交应用程序时所使用的阶段计算目录。 | 2.0.0 |
spark.yarn.preserve.staging.files |
false |
设置为 true 时,在任务完成时会保留阶段文件(Spark Jar 依赖,应用 Jar 文件,和分布式缓存文件),而不是删除它们。 |
1.1.0 |
spark.yarn.scheduler.heartbeat.interval-ms |
3000 |
Spark 应用的 AM 和 Yarn ResourceManager 之间的心跳时间间隔。该值的最大值为 Yarn 过期时间间隔(yarn.am.liveness-monitor.expiry-interval-ms )的一半。 |
0.8.1 |
spark.yarn.scheduler.initial-allocation.interval |
200ms |
当申请容器的请求未被满足时 Spark 应用 AM 向 Yarn ResourceManager 发送心跳信息的初始时间间隔。该值不应该大于 spark.yarn.scheduler.heartbeat.interval-ms 。如果等待分配的容器依旧存在的话,申请分配的时间间隔会在成功收到心跳信息后翻倍,直到时间达到 spark.yarn.scheduler.heartbeat.interval-ms 。(这里有点乱) |
1.4.0 |
spark.yarn.max.executor.failures |
numExecutors * 2,最小值为 3 | 判定应用程序失败前 executor 异常的最大次数。 | 1.0.0 |
spark.yarn.historyServer.address |
(none) | Spark history server 的监听地址,例如 host.com:18080 。该地址不应该包含协议模式(http:// )。默认为空,因为 history server 是一个可选的服务。该地址提供给 Yarn ResourceManager,在 Spark 应用程序结束之后,将 ResourceManager UI 链接到 Spark history server UI。为此,Yarn 属性可以用变量替代,会在 Spark 运行时进行替换。例如,如果 Spark history server 运行在和 YARN ResourceManager 相同的节点上,可以被设置为 ${hadoopconf-yarn.resourcemanager.hostname}:18080 。 |
1.0.0 |
spark.yarn.dist.archives |
(none) | 每个 executor 的工作目录中需要抽取的以逗号分隔的归档文件的列表。 | 1.0.0 |
spark.yarn.dist.files |
(none) | 需要放到每个 executor 的工作目录中的以逗号分隔的文件的列表。 | 1.0.0 |
spark.yarn.dist.jars |
(none) | 需要放到每个 executor 的工作目录中的以逗号分隔的 Jar 文件的列表。 | 2.0.0 |
spark.yarn.dist.forceDownloadSchemes |
(none) |
以逗号分隔的模式列表,资源将会下载到本地硬盘,而不是 Yarn 的分布式缓存。适用于 Yarn 不支持但是 Spark 支持的模式的场景,比如 http,https 和 ftp,或者需要的 Jar 文件应该加入到 Yarn 本地客户端 classpath 中。通配符「*」表示下载所有模式的资源。 | 2.3.0 |
spark.executor.instances |
2 |
静态资源分配的 executor 数量。如果开启了 spark.dynamicAllocation.enabled ,初始 executor 数量最少会是这么多。 |
1.0.0 |
spark.yarn.am.memoryOverhead |
AM memory * 0.10, with minimum of 384 | 与 spark.driver.memoryOverhead 相同,但是针对的是 client 模式下的 YARN AM。 |
1.3.0 |
spark.yarn.queue |
default |
应用程序提交到的 Yarn 队列。 | 1.0.0 |
spark.yarn.jars |
(none) | Spark 依赖文件列表,会分发到 Yarn 的容器中。默认情况下,会使用本地安装的 Spark 依赖,但是 Spark 依赖也可以存放在全局可读的 HDFS 路径中。这种方式可以让 Yarn 将依赖缓存到节点上,而不需要在每次应用程序启动时都分发一次。例如,对于指向 HDFS 路径的依赖,可以配置为 hdfs:///some/path ,支持通配符的使用。 |
2.0.0 |
spark.yarn.archive |
(none) | 一个包含 Spark 依赖的归档文件(压缩文件),用于 Yarn 的分布式缓存依赖。如果设置了该配置项,会替代配置项 spark.yarn.jars ,该归档文件会应用到所有的应用程序容器中。依赖应该在归档文件中的根路径中。跟前一个配置一样,归档文件可以放到 HDFS 上来加速分发。 |
2.0.0 |
spark.yarn.appMasterEnv.[EnvironmentVariableName] |
(none) | 为 Yarn 上启动的 AM 添加环境变量 EnvironmentVariableName 。用户可以设置多个该配置项来指定多个环境变量。在 cluster 模式下该配置控制 driver 的运行环境,在 client 模式下值控制 executor 启动器的运行环境。 |
1.1.0 |
spark.yarn.containerLauncherMaxThreads |
25 |
AM 启动 executor 容器的最大线程数。 | 1.2.0 |
spark.yarn.am.extraJavaOptions |
(none) | 在 client 模式下传递给 AM 的额外的 JVM 选项字符串,在 cluster 模式下,请使用 spark.driver.extraJavaOptions 代替。注意,通过该选项配置最大堆内存(-Xmx)是不合法的。最大堆内存可以通过 spark.yarn.am.memory 配置。 |
1.3.0 |
spark.yarn.am.extraLibraryPath |
(none) | 在 client 模式下,设置启动 AM 的特定的依赖库。 |
1.4.0 |
spark.yarn.populateHadoopClasspath |
true | 是否通过 yarn.application.classpath 和 mapreduce.application.classpath 填充 Hadoop 的 classpath。注意,如果该配置设置为 false ,就需要 with-Hadoop 的 Spark 版本,其中包含了 Hadoop 运行时依赖,或者用户必须单独提供 Hadoop 的部署。 |
2.4.6 |
spark.yarn.maxAppAttempts |
yarn.resourcemanager.am.max-attempts in YARN |
提交应用程序的最大尝试次数。该值应该不大于 Yarn 配置中的最大尝试次数。 | 1.3.0 |
spark.yarn.am.attemptFailuresValidityInterval |
(none) | 定义跟踪 AM 失败的有效时间间隔。如果 AM 已经运行了该值这么久,AM 的失败计数将会被重置。如果没有配置则不启用该功能。 | 1.6.0 |
spark.yarn.executor.failuresValidityInterval |
(none) | 定义跟踪 executor 失败的有效时间间隔。超过该值的 executor 失败会被忽略。 | 2.0.0 |
spark.yarn.submit.waitAppCompletion |
true |
在 cluster 模式下,控制客户端是否等待应用程序运行结束。如果设置为 true ,客户端进程将会持续报告应用程序的状态。否则,客户端进程会在任务提交成功之后退出。 |
1.4.0 |
spark.yarn.am.nodeLabelExpression |
(none) | 用来限制可以运行 AM 的节点的标签表达式。只有版本高于 2.6 的 Yarn 才支持标签表达式,所以如果使用较早的版本,该配置将会被忽略。 | 1.6.0 |
spark.yarn.executor.nodeLabelExpression |
(none) | 用来限制可以运行 executor 的节点的标签表达式。只有版本高于 2.6 的 Yarn 才支持标签表达式,所以如果使用较早的版本,该配置将会被忽略。 | 1.4.0 |
spark.yarn.tags |
(none) | 以逗号分隔的字符串列表,代表应用程序的标签,会在 应用程序报告中展示,可以在查询 Yarn 应用程序时用作过滤条件。 | 1.5.0 |
spark.yarn.priority |
(none) | 用于定义挂起应用程序排序策略的优先级,拥有较高数值的应用程序将会更有机会被激活。目前,Yarn 只支持在使用 FIFO 排序策略的时候使用优先级。 | 3.0.0 |
spark.yarn.config.gatewayPath |
(none) | 一个网关主机(Spark 应用程序启动的主机)上有效的路径,但是对于集群中不同的节点可能不一样。与参数 spark.yarn.config.replacementPath 一起使用,该参数用来支持节点配置不尽相同的集群,让 Spark 能够正确的启动远端进程。替换路径通常包含由 Yarn 暴露的环境变量的引用(所以对 Spark 应用程序容器是可见的)。例如,如果网关节点的 Hadoop 依赖安装在目录 /disk1/hadoop ,该位置作为环境变量 HADOOP_HOME 被 Yarn 暴露出来,此时将该参数设置为 /disk1/hadoop ,并将替换路径设置为 $HADOOP_HOME 可以保证在启动远端进程时使用的路径是正确的。 |
1.5.0 |
spark.yarn.config.replacementPath |
(none) | 参见 spark.yarn.config.gatewayPath 。 |
1.5.0 |
spark.yarn.rolledLog.includePattern |
(none) | 用于过滤日志文件名称的 Java 正则表达式,匹配的日志文件将会以滚动的方式聚合。该参数应该和 Yarn 的滚动日志聚合一起使用。在 Yarn 上开启该功能需要在 yarn-site.xml 文件中配置参数 yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds 。Spark 的 log4j appender 需要修改为使用 FileAppender 或者其他可以处理日志文件被清理的 appender。基于在 log4j 中配置的文件名称(比如 spark.log ),用户应该将正则表达式设置为 spark*,来将所有需要被聚合的日志都包含在内。 |
2.0.0 |
spark.yarn.rolledLog.excludePattern |
(none) | 用于过滤日志文件名称的 Java 正则表达式,匹配的日志文件将会被聚合操作排除在外。如果文件名称同时匹配 include 模式和 exclude 模式,该文件最终会被排除在外。 | 2.0.0 |
spark.yarn.blacklist.executor.launch.blacklisting.enabled |
false | 是否开启节点黑名单机制。判断是否加入黑名单的故障次数可以通过参数 spark.blacklist.application.maxFailedExecutorsPerNode 配置。 |
2.4.0 |
spark.yarn.exclude.nodes |
(none) | 在资源分配中剔除的 Yarn 节点,以逗号分隔。 | 3.0.0 |
spark.yarn.metrics.namespace |
(none) | AM 统计信息报告的根命名空间。如果未设置,则使用 Yarn 应用程序 ID。 | 2.4.0 |
SHS 自定义 executor 日志 URL 可用的匹配模式
官网上就是这样的,也没懂起这是啥
Pattern | Meaning |
---|---|
http:// or https:// according to YARN HTTP policy. (Configured via yarn.http.policy ) |
|
The "host" of node where container was run. | |
The "port" of node manager where container was run. | |
The "port" of node manager's http server where container was run. | |
Http URI of the node on which the container is allocated. | |
The cluster ID of Resource Manager. (Configured via yarn.resourcemanager.cluster-id ) |
|
The ID of container. | |
'SPARK_USER' on system environment. | |
stdout , stderr . |
例如,如果你想将日志 URL 直接链接到 Job History Server,而不是让 NodeManager 的 http server 重定向,可以配置参数 spark.history.custom.executor.log.url
为:
:/jobhistory/logs/:////?start=-4096
注意:需要将
和
替换为实际的值。
资源分配和配置概述
请确保已经阅读了配置文档 configuration page 中的「自定义资源调度和配置概览」章节(Custom Resource Scheduling and Configuration Overview)。本章节只讨论有关 Yarn 相关的资源调度。
Yarn 通过配置来支持用户 Spark 程序需要的资源,Yarn 上的资源调度在 Yarn 3.1.0 版本中引入。配置资源和隔离的详情参见 Yarn 官方文档。理想情况下容器资源是隔离的,executor 只能访问分配给它的资源。如果没有开启资源隔离,用户就要自己负责创建一个发现脚本来保证资源没有被多个 executor 共享。
Yarn 目前支持任意用户自定义的资源类型,除了内置的 GPU(yarn.io/gpu
)和 FPGA(yarn.io/fpga
)类型。所以,如果使用了这两种资源,Spark 可以将 spark 资源翻译为 Yarn 资源,需要做的只是设置参数 spark.{driver/executor}.resource.
。如果使用了 FPGA 或者 GPU 之外的资源类型,用户需要自己设置 Yarn(spark.yarn.{driver/executor}.resource.
)和 Spark(spark.{driver/executor}.resource.
)的参数。
例如,如果需要为每个 executor 申请两个 GPU,用户可以指定 spark.executor.resource.gpu.amount=2
,Spark 会负责向 Yarn 申请 yarn.io/gpu
资源。
如果使用了自定义的 Yarn 资源类型,假设为 acceleratorX
,那么用户必须同时指定 spark.yarn.executor.resource.acceleratorX.amount=2
和 spark.executor.resource.acceleratorX.amount=2
。
Yarn 并没有告诉 Spark 分配给各个容器的资源的地址,所以,用户必须指定一个 executor 在启动时运行的发现脚本来发现可用的资源。在 Spark 安装目录中有一个示例脚本 examples/src/main/scripts/getGpusResources.sh
。该脚本必须有执行权限,用户还应该为其设置权限避免恶意用户的修改。该脚本需要以 ResourceInformation
的格式向标准输出写入一个 JSON 字符串,其中包含一个资源名称以及一个资源地址的数组。
重要事项
- 调度决策中核数申请是否会被满足取决于采用的何种类似的调度器及其是如何配置的。
- 在
cluster
模式下,driver 和 executor 所用的本地目录就是 Yarn 中所配置的本地目录(Hadoop Yarn 配置项yarn.nodemanager.local-dirs
)。如果用户指定了spark.local.dir
,该参数会被忽略。在client
模式下,executor 所用的本地目录就是 Yarn 中所配置的本地目录,而 driver 会使用参数spark.local.dir
定义的目录。因为在client
模式下 driver 没有运行在 Yarn 的集群中,只有 executor 在集群上运行。 - 选项
--files
和--archives
支持用 # 指定文件名称,和 Hadoop 类似。例如,如果指定--files localtest.txt#appSees.txt
,那么将会本地名称为localtest.txt
的文件上传到 HFDS,但是会被链接为名称为appSees.txt
的文件,应用程序在 Yarn 上运行时应该使用名称appSees.txt
来访问该文件。 - 如果使用本地文件但是在
cluster
模式下运行,选项--jars
指定的 Jar 文件可以通过SparkContext.addJar
方法访问。如果使用 HDFS,HTTP,HTTPS 或者 FTP 文件则不需要使用该选项。
Kerberos
标准的 Kerberos 支持参见 Security 文档。
在 Yarn 模式下访问 Hadoop 文件系统时,除了 Hadoop 配置文件中的默认文件系统,Spark 还会自动获取代理 token 来服务应用程序的 stage 目录。
Yarn 的 Kerberos 配置
属版本性名称 | 默认值 | 含义 | 起始版本 |
---|---|---|---|
spark.kerberos.principal |
(none) | 在安全集群中运行时用来登录 KDC 的 Principal,等同于命令行参数 --principal 。(也适用于 master 为「local」的场景) |
3.0.0 |
spark.kerberos.keytab |
(none) | 上述 principal 相应的 keytab 文件的完整路径。该 keytab 文件在会被拷贝到运行 Yarn AM 的节点上的分布式缓存中,用来定期更新 ticket 和代理 tocken。等同于命令行参数 --keytab 。(也适用于 master 为「local」的场景) |
3.0.0 |
spark.yarn.kerberos.relogin.period |
1m | 多久检查一次 kerberos TGT 应该被更新,该值应该比 TGT 续约时间短(或者 TGT 声明周期,如果 TGT 续约时间没有被更新的话)。默认值应该可以满足大多数场景的需要。 | 2.3.0 |
Kerberos 疑难解答
调试 Hadoop/Kerberos 问题是很困难的。一个有效的技巧就是启动 Hadoop 中 Kerberos 操作的额外日志输出,可以通过设置 HADOOP_JAAS_DEBUG
环境变量来设置。
export HADOOP_JAAS_DEBUG=true
可以通过系统属性 sun.security.krb5.debug
和 sun.security.spnego.debug
来配置 JDK 类开启 Kerberos 和 SPNEGO/REST 认证的额外日志输出。
-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true
所有这些选项都可以在 AM 中开启:
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
,日志将会包含所获得的的 token 列表,以及它们的过期时间信息。
配置 External Shuffle Service
如果要在 Yarn 集群中的每个 NodeManager
上启动 Spark Shuffle Service,需要以下几个步骤:
- 和 YARN profile 一起编译 Spark,如果使用预置版本请跳过这一步。
- 找到
spark-
。如果自定编译 Spark,该文件应该在-yarn-shuffle.jar $SPARK_HOME/common/network-yarn/target/scala-
目录下;如果使用预置版本,应该在目录yarn
下。 - 将该 Jar 文件添加到集群中所有
NodeManager
的 classpath 中。 - 在集群中每个节点上的配置文件
yarn-site.xml
中,添加spark_shuffle
到yarn.nodemanager.aux-services
,并将yarn.nodemanager.aux-services.spark_shuffle.class
设置为org.apache.spark.network.yarn.YarnShuffleService
。 - 通过配置文件
etc/hadoop/yarn-env.sh
中的YARN_HEAPSIZE
环境变量增加NodeManager
的堆内存(默认为 1000),来避免 shuffle 过程中的垃圾回收问题。 - 重启集群中所有的
NodeManager
。
下面的额外配置项在 shuffle service 运行到 Yarn 集群上时可以使用:
属性名称 | 默认值 | 含义 |
---|---|---|
spark.yarn.shuffle.stopOnFailure |
false |
是否在 Spark Shuffle Service 初始化失败时停止该 NodeManager。开启后会防止应用程序因为 Spark Shuffle Service 没有在运行而出现运行异常。 |
Launching your application with Apache Oozie
Apache Oozie 可以将 Spark 应用程序作为工作流的一部分来启动。在一个安全集群中,启动的应用程序需要相应的 token 来访问集群服务。如果 Spark 启动时携带了 keytab 文件,这些会自动完成。然而,如果没有携带 keytab 文件,那么安全机制的责任就会传递给 Oozie。
关于在安全集群上配置 Oozie 以及为某个任务获取认证文件的详情参见相应版本 Oozie web site 的「Authentication」章节。
对于 Spark 应用程序,Oozie 工作流必须获取应用程序需要的所有 token,包括:
- YARN 资源管理器。
- 本地 Hadoop 文件系统
- 作为 IO 数据源或者目的地用到的远程 Hadoop 文件系统。
- Hive — 如果用到的话。
- HBase — 如果用到的话。
- YARN 时间线服务器,如果应用程序与之交互的话。
为了避免 Spark 尝试获取 Hive,HBase 以及远程 HDFS token——然后失败(很尴尬),Spark 配置必须禁用这些服务的 token 收集。
Spark 配置文件必须包含:
spark.security.credentials.hive.enabled false
spark.security.credentials.hbase.enabled false
配置项 spark.kerberos.access.hadoopFileSystems
必须不设定。
使用 Spark History Server 代替 Spark Web 界面
在应用程序界面被禁用时,可以使用 Spark History Server 的应用程序页面来跟踪正在运行的应用程序的进度。这种方式适用于安全集群,还可以降低 driver 端的内存消耗。启用 Spark History Server,需要以下步骤:
- 在应用程序端,设置参数
spark.yarn.historyServer.allowTracking=true
,该配置会告诉 Spark 如果没有开启应用程序界面则使用 history server 的 URL 来跟踪应用程序。 - 在 the Spark History Server 端,添加
org.apache.spark.deploy.yarn.YarnProxyRedirectFilter
到参数spark.ui.filters
的过滤器列表中。
需要知道的是 history server 中的应用程序状态信息可能不会及时更新。