监控与检测

有几种方法可以监控 Spark 应用程序:Web UI、指标和外部检测。

Web 界面

每个 SparkContext 默认在端口 4040 上启动一个 Web UI,显示关于应用程序的有用信息。这包括:

您可以通过在 Web 浏览器中简单地打开 http://<driver-node>:4040 来访问此界面。如果多个 SparkContext 在同一主机上运行,它们将绑定到从 4040 开始的连续端口(4041、4042 等)。

请注意,默认情况下,此信息仅在应用程序的运行期间可用。要在事后查看 Web UI,请在启动应用程序之前将 spark.eventLog.enabled 设置为 true。这将配置 Spark 记录 Spark 事件,这些事件将 UI 中显示的信息编码到持久存储中。

事后查看

如果应用程序的事件日志存在,仍然可以通过 Spark 的历史服务器构建应用程序的 UI。您可以通过执行以下命令启动历史服务器:

./sbin/start-history-server.sh

这将在默认情况下于 http://<server-url>:18080 创建一个 Web 界面,列出不完整和已完成的应用程序和尝试。

当使用文件系统提供程序类时(参见下面的 spark.history.provider),必须在 spark.history.fs.logDirectory 配置选项中提供基本日志目录,并且应包含子目录,每个子目录代表一个应用程序的事件日志。

必须将 spark 作业本身配置为记录事件,并将它们记录到同一个共享的、可写的目录。例如,如果服务器配置的日志目录为 hdfs://namenode/shared/spark-logs,那么客户端选项将是:

spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs

可以按如下方式配置历史服务器:

环境变量

环境变量含义
SPARK_DAEMON_MEMORY 分配给历史服务器的内存(默认值:1g)。
SPARK_DAEMON_JAVA_OPTS 历史服务器的 JVM 选项(默认值:无)。
SPARK_DAEMON_CLASSPATH 历史服务器的类路径(默认值:无)。
SPARK_PUBLIC_DNS 历史服务器的公共地址。如果未设置此选项,则应用程序历史记录的链接可能会使用服务器的内部地址,从而导致链接断开(默认值:无)。
SPARK_HISTORY_OPTS 历史服务器的 spark.history.* 配置选项(默认值:无)。

在滚动事件日志文件上应用压缩

长时间运行的应用程序(例如流式传输)可能会产生一个巨大的单个事件日志文件,维护成本很高,并且每次在 Spark 历史服务器中更新时都需要大量的资源来重放。

启用 spark.eventLog.rolling.enabledspark.eventLog.rolling.maxFileSize 可以让您拥有滚动事件日志文件,而不是单个巨大的事件日志文件,这可能有助于某些情况,但它仍然无法帮助您减少日志的总体大小。

Spark 历史服务器可以通过在 Spark 历史服务器上设置配置 spark.history.fs.eventLog.rolling.maxFilesToRetain 来对滚动事件日志文件应用压缩,以减少日志的总体大小。

详细信息将在下面描述,但请事先注意压缩是*有损*操作。压缩会丢弃某些事件,这些事件将不再在 UI 上显示 - 您可能需要在启用该选项之前检查哪些事件将被丢弃。

当压缩发生时,历史服务器列出应用程序的所有可用事件日志文件,并将索引小于将保留的具有最小索引的文件的事件日志文件视为压缩的目标。例如,如果应用程序 A 有 5 个事件日志文件,并且 spark.history.fs.eventLog.rolling.maxFilesToRetain 设置为 2,那么将选择前 3 个日志文件进行压缩。

一旦它选择了目标,它就会分析它们以确定哪些事件可以排除,并将它们重写为一个紧凑的文件,并丢弃决定排除的事件。

压缩尝试排除指向过时数据的事件。截至目前,下面描述了要排除的事件的候选对象:

重写完成后,将尽最大努力删除原始日志文件。历史服务器可能无法删除原始日志文件,但这不会影响历史服务器的运行。

请注意,如果 Spark 历史服务器发现压缩期间不会减少太多空间,则可能不会压缩旧的事件日志文件。对于流式查询,我们通常期望压缩会运行,因为每个微批次都会触发一个或多个很快完成的作业,但在许多情况下,压缩不会针对批处理查询运行。

另请注意,这是 Spark 3.0 中引入的一项新功能,可能并不完全稳定。在某些情况下,压缩可能会排除比您预期的更多的事件,从而导致应用程序的历史服务器上出现一些 UI 问题。请谨慎使用。

Spark 历史服务器配置选项

Spark 历史服务器的安全选项在 安全 页面中有更详细的介绍。

属性名称 默认值 含义 起始版本
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider 实现应用程序历史记录后端的类的名称。目前只有一个由 Spark 提供的实现,它查找存储在文件系统中的应用程序日志。 1.1.0
spark.history.fs.logDirectory file:/tmp/spark-events 对于文件系统历史记录提供程序,包含要加载的应用程序事件日志的目录的 URL。这可以是本地 file:// 路径、HDFS 路径 hdfs://namenode/shared/spark-logs 或 Hadoop API 支持的替代文件系统的路径。 1.1.0
spark.history.fs.update.interval 10s 文件系统历史记录提供程序检查日志目录中新的或更新的日志的周期。较短的时间间隔可以更快地检测到新的应用程序,但会增加服务器重新读取更新的应用程序的负载。一旦更新完成,已完成和未完成的应用程序列表将反映这些更改。 1.4.0
spark.history.retainedApplications 50 在缓存中保留 UI 数据的应用程序的数量。如果超过此上限,则最早的应用程序将从缓存中删除。如果应用程序不在缓存中,则如果从 UI 访问它,则必须从磁盘加载它。 1.0.0
spark.history.ui.maxApplications Int.MaxValue 在历史记录摘要页面上显示的应用程序的数量。即使应用程序未显示在历史记录摘要页面上,仍然可以通过直接访问其 URL 来访问应用程序 UI。 2.0.1
spark.history.ui.port 18080 历史服务器的 Web 界面绑定到的端口。 1.0.0
spark.history.kerberos.enabled false 指示历史服务器是否应使用 Kerberos 登录。如果历史服务器正在访问安全 Hadoop 集群上的 HDFS 文件,则需要此设置。 1.0.1
spark.history.kerberos.principal (none) spark.history.kerberos.enabled=true 时,指定历史服务器的 Kerberos 主体名称。 1.0.1
spark.history.kerberos.keytab (none) spark.history.kerberos.enabled=true 时,指定历史服务器的 Kerberos keytab 文件的位置。 1.0.1
spark.history.fs.cleaner.enabled false 指定历史服务器是否应定期清理存储中的事件日志。 1.4.0
spark.history.fs.cleaner.interval 1d spark.history.fs.cleaner.enabled=true 时,指定文件系统作业历史记录清理器检查要删除的文件的频率。如果至少满足以下两个条件之一,则会删除文件。首先,如果文件早于 spark.history.fs.cleaner.maxAge,则会删除它们。如果文件数大于 spark.history.fs.cleaner.maxNum,也会删除它们,Spark 尝试根据应用程序最早的尝试时间顺序清理已完成的尝试。 1.4.0
spark.history.fs.cleaner.maxAge 7d spark.history.fs.cleaner.enabled=true 时,早于此时间的作业历史记录文件将在文件系统历史记录清理器运行时被删除。 1.4.0
spark.history.fs.cleaner.maxNum Int.MaxValue spark.history.fs.cleaner.enabled=true 时,指定事件日志目录中的最大文件数。Spark 尝试清理已完成的尝试日志,以使日志目录保持在此限制之下。这应该小于底层文件系统限制,例如 HDFS 中的 `dfs.namenode.fs-limits.max-directory-items`。 3.0.0
spark.history.fs.endEventReparseChunkSize 1m 在日志文件末尾解析多少字节以查找结束事件。这用于通过跳过事件日志文件中不必要的部分来加速应用程序列表的生成。可以通过将此配置设置为 0 来禁用它。 2.4.0
spark.history.fs.inProgressOptimization.enabled true 启用对正在进行的日志的优化处理。此选项可能会将未能重命名其事件日志的已完成应用程序列为正在进行中。 2.4.0
spark.history.fs.driverlog.cleaner.enabled spark.history.fs.cleaner.enabled 指定 History Server 是否应定期从存储中清理驱动程序日志。 3.0.0
spark.history.fs.driverlog.cleaner.interval spark.history.fs.cleaner.interval spark.history.fs.driverlog.cleaner.enabled=true 时,指定文件系统驱动程序日志清理器检查要删除的文件的频率。只有当文件早于 spark.history.fs.driverlog.cleaner.maxAge 时才会被删除。 3.0.0
spark.history.fs.driverlog.cleaner.maxAge spark.history.fs.cleaner.maxAge spark.history.fs.driverlog.cleaner.enabled=true 时,早于此值的驱动程序日志文件将在驱动程序日志清理器运行时被删除。 3.0.0
spark.history.fs.numReplayThreads 可用内核的 25% History Server 用于处理事件日志的线程数。 2.0.0
spark.history.store.maxDiskUsage 10g 用于存储缓存的应用程序历史信息的本地目录的最大磁盘使用量。 2.3.0
spark.history.store.path (none) 用于缓存应用程序历史数据的本地目录。如果设置,history server 会将应用程序数据存储在磁盘上,而不是保存在内存中。写入磁盘的数据将在 history server 重新启动时重复使用。 2.3.0
spark.history.store.serializer JSON 用于将内存中的 UI 对象写入/读取到基于磁盘的 KV 存储的序列化器;JSON 或 PROTOBUF。 JSON 序列化器是 Spark 3.4.0 之前的唯一选择,因此它是默认值。 与 JSON 序列化器相比,PROTOBUF 序列化器速度更快且更紧凑。 3.4.0
spark.history.custom.executor.log.url (none) 指定自定义的 Spark Executor 日志 URL,以便在 History Server 中支持外部日志服务,而不是使用集群管理器中的应用程序日志 URL。 Spark 将通过模式支持一些路径变量,这些模式可能因集群管理器而异。 请查看集群管理器的文档,了解支持哪些模式(如果有)。 此配置对正在运行的应用程序没有影响,它仅影响 History Server。

目前,只有 YARN 模式支持此配置

3.0.0
spark.history.custom.executor.log.url.applyIncompleteApplication true 指定是否将自定义 Spark Executor 日志 URL 应用于未完成的应用程序。 如果应该将正在运行的应用程序的 Executor 日志作为原始日志 URL 提供,请将其设置为“false”。 请注意,未完成的应用程序可能包括未正常关闭的应用程序。 即使将其设置为“true”,此配置对正在运行的应用程序也没有影响,它仅影响 History Server。 3.0.0
spark.history.fs.eventLog.rolling.maxFilesToRetain Int.MaxValue 将保留为非压缩状态的事件日志文件的最大数量。 默认情况下,将保留所有事件日志文件。 由于技术原因,最小值是 1。
有关更多详细信息,请阅读“应用旧事件日志文件的压缩”部分。
3.0.0
spark.history.store.hybridStore.enabled false 在解析事件日志时,是否使用 HybridStore 作为存储。 HybridStore 会首先将数据写入内存存储,并在写入内存存储完成后,使用后台线程将数据转储到磁盘存储。 3.1.0
spark.history.store.hybridStore.maxMemoryUsage 2g 可用于创建 HybridStore 的最大内存空间。 HybridStore 共享堆内存,因此如果启用了 HybridStore,则应通过 SHS 的内存选项来增加堆内存。 3.1.0
spark.history.store.hybridStore.diskBackend ROCKSDB 指定在混合存储中使用的基于磁盘的存储;LEVELDB 或 ROCKSDB。 3.3.0
spark.history.fs.update.batchSize Int.MaxValue 指定更新新事件日志文件的批处理大小。 这控制着每个扫描过程在合理的时间内完成,从而防止初始扫描运行时间过长,并及时阻止扫描新的事件日志文件(在大型环境中)。 3.4.0

请注意,在所有这些 UI 中,都可以通过单击其标题对表格进行排序,从而可以轻松识别缓慢的任务、数据倾斜等。

注意

  1. History Server 显示已完成和未完成的 Spark 作业。 如果应用程序在失败后进行了多次尝试,则将显示失败的尝试,以及任何正在进行的未完成尝试或最终成功的尝试。

  2. 未完成的应用程序仅间歇性地更新。 更新之间的时间由检查已更改文件的间隔(spark.history.fs.update.interval)定义。 在较大的集群上,更新间隔可以设置为较大的值。 查看正在运行的应用程序的方式实际上是查看其自己的 Web UI。

  3. 未注册为已完成而退出的应用程序将被列为未完成 - 即使它们不再运行。 如果应用程序崩溃,可能会发生这种情况。

  4. 发出 Spark 作业完成信号的一种方法是显式停止 Spark Context (sc.stop()),或者在 Python 中使用 with SparkContext() as sc: 构造来处理 Spark Context 的设置和拆卸。

REST API

除了在 UI 中查看指标外,它们也可以作为 JSON 使用。 这使开发人员可以轻松地为 Spark 创建新的可视化和监控工具。 JSON 可用于正在运行的应用程序和 History Server。 端点安装在 /api/v1。 例如,对于 History Server,它们通常可以在 http://<server-url>:18080/api/v1 访问,对于正在运行的应用程序,则可以在 http://localhost:4040/api/v1 访问。

在 API 中,应用程序由其应用程序 ID [app-id] 引用。 在 YARN 上运行时,每个应用程序可能有多次尝试,但只有在集群模式下的应用程序才有尝试 ID,客户端模式下的应用程序没有。 YARN 集群模式下的应用程序可以通过其 [attempt-id] 识别。 在下面列出的 API 中,在 YARN 集群模式下运行时,[app-id] 实际上是 [base-app-id]/[attempt-id],其中 [base-app-id] 是 YARN 应用程序 ID。

端点含义
/applications 所有应用程序的列表。
?status=[completed|running] 仅列出所选状态的应用程序。
?minDate=[date] 要列出的最早开始日期/时间。
?maxDate=[date] 要列出的最晚开始日期/时间。
?minEndDate=[date] 要列出的最早结束日期/时间。
?maxEndDate=[date] 要列出的最晚结束日期/时间。
?limit=[limit] 限制列出的应用程序的数量。
示例
?minDate=2015-02-10
?minDate=2015-02-03T16:42:40.000GMT
?maxDate=2015-02-11T20:41:30.000GMT
?minEndDate=2015-02-12
?minEndDate=2015-02-12T09:15:10.000GMT
?maxEndDate=2015-02-14T16:30:45.000GMT
?limit=10
/applications/[app-id]/jobs 给定应用程序的所有作业的列表。
?status=[running|succeeded|failed|unknown] 仅列出特定状态的作业。
/applications/[app-id]/jobs/[job-id] 给定作业的详细信息。
/applications/[app-id]/stages 给定应用程序的所有阶段的列表。
?status=[active|complete|pending|failed] 仅列出给定状态的阶段。
?details=true 列出所有包含任务数据的阶段。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 仅列出具有指定任务状态的任务。 查询参数 taskStatus 仅在 details=true 时生效。 这也支持多个 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,这将返回与任何指定的任务状态匹配的所有任务。
?withSummaries=true 列出具有任务指标分布和执行器指标分布的阶段。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用给定的分位数汇总指标。 查询参数 quantiles 仅在 withSummaries=true 时生效。 默认值为 0.0,0.25,0.5,0.75,1.0
/applications/[app-id]/stages/[stage-id] 给定阶段的所有尝试的列表。
?details=true 列出给定阶段的所有包含任务数据的尝试。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 仅列出具有指定任务状态的任务。 查询参数 taskStatus 仅在 details=true 时生效。 这也支持多个 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,这将返回与任何指定的任务状态匹配的所有任务。
?withSummaries=true 列出每次尝试的任务指标分布和执行器指标分布。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用给定的分位数汇总指标。 查询参数 quantiles 仅在 withSummaries=true 时生效。 默认值为 0.0,0.25,0.5,0.75,1.0
示例
?details=true
?details=true&taskStatus=RUNNING
?withSummaries=true
?details=true&withSummaries=true&quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id] 给定阶段尝试的详细信息。
?details=true 列出给定阶段尝试的所有任务数据。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 仅列出具有指定任务状态的任务。 查询参数 taskStatus 仅在 details=true 时生效。 这也支持多个 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,这将返回与任何指定的任务状态匹配的所有任务。
?withSummaries=true 列出给定阶段尝试的任务指标分布和执行器指标分布。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用给定的分位数汇总指标。 查询参数 quantiles 仅在 withSummaries=true 时生效。 默认值为 0.0,0.25,0.5,0.75,1.0
示例
?details=true
?details=true&taskStatus=RUNNING
?withSummaries=true
?details=true&withSummaries=true&quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary 给定阶段尝试中所有任务的汇总指标。
?quantiles 使用给定的分位数汇总指标。
示例: ?quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList 给定阶段尝试的所有任务的列表。
?offset=[offset]&length=[len] 列出给定范围内的任务。
?sortBy=[runtime|-runtime] 对任务进行排序。
?status=[running|success|killed|failed|unknown] 仅列出该状态的任务。
示例: ?offset=10&length=50&sortBy=runtime&status=running
/applications/[app-id]/executors 给定应用程序的所有活动执行器的列表。
/applications/[app-id]/executors/[executor-id]/threads 给定活动执行器中运行的所有线程的堆栈跟踪。 通过 History Server 不可用。
/applications/[app-id]/allexecutors 给定应用程序的所有执行器(活动的和已死的)的列表。
/applications/[app-id]/storage/rdd 给定应用程序的存储 RDD 的列表。
/applications/[app-id]/storage/rdd/[rdd-id] 给定 RDD 的存储状态的详细信息。
/applications/[base-app-id]/logs 以下载 zip 文件中的文件形式下载给定应用程序的所有尝试的事件日志。
/applications/[base-app-id]/[attempt-id]/logs 以下载 zip 文件形式下载特定应用程序尝试的事件日志。
/applications/[app-id]/streaming/statistics 流上下文的统计信息。
/applications/[app-id]/streaming/receivers 所有流接收器的列表。
/applications/[app-id]/streaming/receivers/[stream-id] 给定接收器的详细信息。
/applications/[app-id]/streaming/batches 所有保留的批次的列表。
/applications/[app-id]/streaming/batches/[batch-id] 给定批次的详细信息。
/applications/[app-id]/streaming/batches/[batch-id]/operations 给定批次的所有输出操作的列表。
/applications/[app-id]/streaming/batches/[batch-id]/operations/[outputOp-id] 给定操作和给定批次的详细信息。
/applications/[app-id]/sql 给定应用程序的所有查询列表。
?details=[true (默认) | false] 列出/隐藏 Spark 计划节点的详细信息。
?planDescription=[true (默认) | false] 在 Physical Plan 大小时按需启用/禁用 Physical planDescription
?offset=[offset]&length=[len] 列出给定范围内的查询。
/applications/[app-id]/sql/[execution-id] 给定查询的详细信息。
?details=[true (默认) | false] 除了给定的查询详细信息外,还列出/隐藏指标详细信息。
?planDescription=[true (默认) | false] 在 Physical Plan 大小时,为给定查询按需启用/禁用 Physical planDescription
/applications/[app-id]/environment 给定应用程序的环境详细信息。
/version 获取当前的 Spark 版本。

可以检索的作业和阶段的数量受到独立 Spark UI 相同保留机制的约束;"spark.ui.retainedJobs" 定义了触发作业垃圾回收的阈值,而 spark.ui.retainedStages 定义了阶段的阈值。 请注意,垃圾回收发生在回放时:可以通过增加这些值并重新启动历史服务器来检索更多条目。

Executor 任务指标

REST API 公开了 Spark 执行器收集的任务指标值,粒度为任务执行。 这些指标可用于性能故障排除和工作负载特征分析。 提供指标列表,以及简短说明

Spark 执行器任务指标名称 简短说明
executorRunTime 执行器运行此任务所花费的已用时间。 包括获取 shuffle 数据的时间。 该值以毫秒为单位表示。
executorCpuTime 执行器运行此任务所花费的 CPU 时间。 包括获取 shuffle 数据的时间。 该值以纳秒为单位表示。
executorDeserializeTime 用于反序列化此任务的已用时间。 该值以毫秒为单位表示。
executorDeserializeCpuTime 执行器上用于反序列化此任务的 CPU 时间。 该值以纳秒为单位表示。
resultSize 此任务作为 TaskResult 传回驱动程序的字节数。
jvmGCTime JVM 在执行此任务时花费在垃圾回收中的已用时间。 该值以毫秒为单位表示。
resultSerializationTime 用于序列化任务结果的已用时间。 该值以毫秒为单位表示。
memoryBytesSpilled 此任务溢出的内存字节数。
diskBytesSpilled 此任务溢出的磁盘字节数。
peakExecutionMemory shuffle、聚合和连接期间创建的内部数据结构使用的峰值内存。 此累加器的值应大致等于此任务中创建的所有此类数据结构的峰值大小之和。 对于 SQL 作业,这仅跟踪所有不安全运算符和 ExternalSort。
inputMetrics.* 与从 org.apache.spark.rdd.HadoopRDD 读取数据或从持久化数据读取数据相关的指标。
    .bytesRead 读取的总字节数。
    .recordsRead 读取的记录总数。
outputMetrics.* 与外部写入数据相关的指标(例如,写入分布式文件系统),仅在具有输出的任务中定义。
    .bytesWritten 写入的总字节数
    .recordsWritten 写入的记录总数
shuffleReadMetrics.* 与 shuffle 读取操作相关的指标。
    .recordsRead 在 shuffle 操作中读取的记录数
    .remoteBlocksFetched 在 shuffle 操作中获取的远程块数
    .localBlocksFetched 在 shuffle 操作中获取的本地块数(与从远程执行器读取的块数相反)
    .totalBlocksFetched 在 shuffle 操作中获取的块数(本地和远程)
    .remoteBytesRead 在 shuffle 操作中读取的远程字节数
    .localBytesRead 从本地磁盘读取的 shuffle 操作中的字节数(与从远程执行器读取的字节数相反)
    .totalBytesRead 在 shuffle 操作中读取的字节数(本地和远程)
    .remoteBytesReadToDisk 在 shuffle 操作中读取到磁盘的远程字节数。 与读取到内存(这是默认行为)相反,大型块被提取到磁盘中进行 shuffle 读取操作。
    .fetchWaitTime 任务等待远程 shuffle 块所花费的时间。 这仅包括阻止 shuffle 输入数据的时间。 例如,如果在任务尚未完成处理块 A 时正在提取块 B,则不会将其视为阻止块 B。 该值以毫秒为单位表示。
shuffleWriteMetrics.* 与写入 shuffle 数据的操作相关的指标。
    .bytesWritten 在 shuffle 操作中写入的字节数
    .recordsWritten 在 shuffle 操作中写入的记录数
    .writeTime 花费在阻止写入磁盘或缓冲区缓存的时间。 该值以纳秒为单位表示。

Executor 指标

执行器级别的指标作为 Heartbeat 的一部分从每个执行器发送到驱动程序,以描述执行器本身的性能指标,例如 JVM 堆内存、GC 信息。 执行器指标值及其每个执行器的测量内存峰值通过 JSON 格式和 Prometheus 格式的 REST API 公开。 JSON 端点在:/applications/[app-id]/executors 公开,Prometheus 端点在:/metrics/executors/prometheus 公开。 Prometheus 端点受配置参数的约束:spark.ui.prometheus.enabled=true(默认为 false)。 此外,如果 spark.eventLog.logStageExecutorMetrics 为 true,则执行器内存指标的每个阶段的聚合峰值将写入事件日志。 执行器内存指标也通过基于 Dropwizard metrics library 的 Spark 指标系统公开。 提供指标列表,以及简短说明

执行器级别指标名称 简短说明
rddBlocks 此执行器的块管理器中的 RDD 块。
memoryUsed 此执行器使用的存储内存。
diskUsed 此执行器用于 RDD 存储的磁盘空间。
totalCores 此执行器中可用的核心数。
maxTasks 此执行器中可以并发运行的最大任务数。
activeTasks 当前正在执行的任务数。
failedTasks 在此执行器中失败的任务数。
completedTasks 在此执行器中完成的任务数。
totalTasks 此执行器中的任务总数(正在运行、失败和已完成)。
totalDuration JVM 在此执行器中执行任务所花费的已用时间。 该值以毫秒为单位表示。
totalGCTime JVM 在此执行器中垃圾回收所花费的累计已用时间。 该值以毫秒为单位表示。
totalInputBytes 在此执行器中累积的输入字节总数。
totalShuffleRead 在此执行器中累积的 shuffle 读取字节总数。
totalShuffleWrite 在此执行器中累积的 shuffle 写入字节总数。
maxMemory 可用于存储的总内存量,以字节为单位。
memoryMetrics.* 内存指标的当前值
    .usedOnHeapStorageMemory 当前用于存储的堆内存量,以字节为单位。
    .usedOffHeapStorageMemory 当前用于存储的堆外内存量,以字节为单位。
    .totalOnHeapStorageMemory 可用于存储的堆内存总量,以字节为单位。 此金额可能随时间变化,取决于 MemoryManager 实现。
    .totalOffHeapStorageMemory 可用于存储的堆外内存总量,以字节为单位。 此金额可能随时间变化,具体取决于 MemoryManager 实现。
peakMemoryMetrics.* 内存(和 GC)指标的峰值
    .JVMHeapMemory 用于对象分配的堆的峰值内存使用量。 堆由一个或多个内存池组成。 返回的内存使用量的已使用和已提交大小是所有堆内存池的这些值的总和,而返回的内存使用量的初始和最大大小表示堆内存的设置,这可能不是所有堆内存池的总和。 返回的内存使用量中已用内存量是由活动对象和尚未收集的垃圾对象占用的内存量(如果有)。
    .JVMOffHeapMemory Java 虚拟机使用的非堆内存的峰值内存使用量。 非堆内存由一个或多个内存池组成。 返回的内存使用量的已使用和已提交大小是所有非堆内存池的这些值的总和,而返回的内存使用量的初始和最大大小表示非堆内存的设置,这可能不是所有非堆内存池的总和。
    .OnHeapExecutionMemory 使用的堆上执行内存峰值,以字节为单位。
    .OffHeapExecutionMemory 使用的堆外执行内存峰值,以字节为单位。
    .OnHeapStorageMemory 使用的堆上存储内存峰值,以字节为单位。
    .OffHeapStorageMemory 使用的堆外存储内存峰值,以字节为单位。
    .OnHeapUnifiedMemory 堆上内存峰值(执行和存储)。
    .OffHeapUnifiedMemory 堆外内存峰值(执行和存储)。
    .DirectPoolMemory JVM 用于直接缓冲区池的峰值内存 (java.lang.management.BufferPoolMXBean)
    .MappedPoolMemory JVM 用于映射缓冲区池的峰值内存 (java.lang.management.BufferPoolMXBean)
    .ProcessTreeJVMVMemory 虚拟内存大小,以字节为单位。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .ProcessTreeJVMRSSMemory 常驻集大小:进程在实际内存中拥有的页数。 这只是计入文本、数据或堆栈空间的页。 这不包括尚未按需加载的或已交换出的页面。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .ProcessTreePythonVMemory Python 的虚拟内存大小,以字节为单位。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .ProcessTreePythonRSSMemory Python 的常驻集大小。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .ProcessTreeOtherVMemory 其他类型的进程的虚拟内存大小,以字节为单位。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .ProcessTreeOtherRSSMemory 其他类型的进程的常驻集大小。 如果 spark.executor.processTreeMetrics.enabled 为 true,则启用。
    .MinorGCCount 总的 Minor GC 次数。 例如,垃圾收集器可以是 Copy、PS Scavenge、ParNew、G1 Young Generation 等。
    .MinorGCTime 消耗的总 Minor GC 时间。 该值以毫秒为单位表示。
    .MajorGCCount 总的 Major GC 次数。 例如,垃圾收集器可以是 MarkSweepCompact、PS MarkSweep、ConcurrentMarkSweep、G1 Old Generation 等。
    .MajorGCTime 消耗的总 Major GC 时间。 该值以毫秒为单位表示。

RSS 和 Vmem 的计算基于 proc(5)

API 版本策略

这些端点已经过强版本控制,以便更容易地在其之上开发应用程序。 特别是,Spark 保证:

请注意,即使在检查正在运行的应用程序的 UI 时,仍然需要 applications/[app-id] 部分,尽管只有一个应用程序可用。 例如,要查看正在运行的应用程序的作业列表,您需要访问 http://localhost:4040/api/v1/applications/[app-id]/jobs。 这是为了保持两种模式下的路径一致。

指标

Spark 具有基于 Dropwizard Metrics Library 的可配置指标系统。 这允许用户将 Spark 指标报告给各种接收器,包括 HTTP、JMX 和 CSV 文件。 这些指标由嵌入在 Spark 代码库中的源生成。 它们为特定的活动和 Spark 组件提供检测。 指标系统通过配置文件进行配置,Spark 期望该文件位于 $SPARK_HOME/conf/metrics.properties。 可以通过 spark.metrics.conf 配置属性 指定自定义文件位置。 可以不使用配置文件,而使用带有前缀 spark.metrics.conf. 的一组配置参数。 默认情况下,用于驱动程序或执行程序指标的根命名空间是 spark.app.id 的值。 但是,通常用户希望能够跨驱动程序和执行程序的应用程序跟踪指标,这使用应用程序 ID (即 spark.app.id) 很难做到,因为它随着应用程序的每次调用而变化。 对于此类用例,可以使用 spark.metrics.namespace 配置属性为指标报告指定自定义命名空间。 例如,如果用户希望将指标命名空间设置为应用程序的名称,他们可以将 spark.metrics.namespace 属性设置为类似 ${spark.app.name} 的值。 然后,该值由 Spark 适当地展开,并用作指标系统的根命名空间。 非驱动程序和执行程序指标永远不会以 spark.app.id 为前缀,并且 spark.metrics.namespace 属性对此类指标没有任何影响。

Spark 的指标被分解为与 Spark 组件相对应的不同实例。 在每个实例中,您可以配置一组接收器,指标将报告给这些接收器。 当前支持以下实例:

每个实例都可以报告给零个或多个接收器。 接收器包含在 org.apache.spark.metrics.sink 包中:

Spark 还支持 Ganglia 接收器,但由于许可限制,未包含在默认构建中。

要安装 GangliaSink,您需要执行 Spark 的自定义构建。 请注意,通过嵌入此库,您将在 Spark 包中包含 LGPL 许可的代码。 对于 sbt 用户,请在构建之前设置 SPARK_GANGLIA_LGPL 环境变量。 对于 Maven 用户,请启用 -Pspark-ganglia-lgpl 配置文件。 除了修改集群的 Spark 构建之外,用户应用程序还需要链接到 spark-ganglia-lgpl 工件。

指标配置文件的语法以及每个接收器可用的参数在示例配置文件 $SPARK_HOME/conf/metrics.properties.template 中定义。

当使用 Spark 配置参数而不是指标配置文件时,相关的参数名称由前缀 spark.metrics.conf. 后跟配置详细信息组成,即参数采用以下形式: spark.metrics.conf.[instance|*].sink.[sink_name].[parameter_name]。 此示例显示了 Graphite 接收器的 Spark 配置参数列表:

"spark.metrics.conf.*.sink.graphite.class"="org.apache.spark.metrics.sink.GraphiteSink"
"spark.metrics.conf.*.sink.graphite.host"="graphiteEndPoint_hostName>"
"spark.metrics.conf.*.sink.graphite.port"=<graphite_listening_port>
"spark.metrics.conf.*.sink.graphite.period"=10
"spark.metrics.conf.*.sink.graphite.unit"=seconds
"spark.metrics.conf.*.sink.graphite.prefix"="optional_prefix"
"spark.metrics.conf.*.sink.graphite.regex"="optional_regex_to_send_matching_metrics"

Spark 指标配置的默认值如下:

"*.sink.servlet.class" = "org.apache.spark.metrics.sink.MetricsServlet"
"*.sink.servlet.path" = "/metrics/json"
"master.sink.servlet.path" = "/metrics/master/json"
"applications.sink.servlet.path" = "/metrics/applications/json"

可以使用指标配置文件或配置参数 spark.metrics.conf.[component_name].source.jvm.class=[source_name] 配置其他源。 目前,JVM 源是唯一可用的可选源。 例如,以下配置参数激活 JVM 源: "spark.metrics.conf.*.source.jvm.class"="org.apache.spark.metrics.source.JvmSource"

可用指标提供程序列表

Spark 使用的指标有多种类型:gauge、counter、histogram、meter 和 timer,有关详细信息,请参见 Dropwizard 库文档。 以下组件和指标列表报告了名称以及有关可用指标的一些详细信息,并按组件实例和源命名空间进行分组。 Spark 检测中最常见的指标类型是 gauge 和 counter。 Counter 可以识别为它们具有 .count 后缀。 timer、meter 和 histogram 在列表中进行了注释,列表的其余元素是 gauge 类型的指标。 大多数指标在其父组件实例配置后立即处于活动状态,某些指标还需要通过其他配置参数启用,详细信息在列表中报告。

组件实例 = Driver

这是具有最多检测指标的组件。

组件实例 = Executor

这些指标由 Spark executor 公开。

源 = JVM 源

备注

组件实例 = applicationMaster

注意:适用于在 YARN 上运行

组件实例 = mesos_cluster

注意:适用于在 mesos 上运行

组件实例 = master

注意:适用于在 Spark standalone 中作为 master 运行

组件实例 = ApplicationSource

注意:适用于在 Spark standalone 中作为 master 运行

组件实例 = worker

注意:适用于在 Spark standalone 中作为 worker 运行

组件实例 = shuffleService

注意:适用于 shuffle 服务

高级检测

可以使用多种外部工具来帮助分析 Spark 作业的性能

Spark 还提供了一个插件 API,以便可以将自定义检测代码添加到 Spark 应用程序。 有两个配置键可用于将插件加载到 Spark 中

两者都接受一个逗号分隔的类名列表,这些类名实现了 org.apache.spark.api.plugin.SparkPlugin 接口。 存在这两个名称,以便可以将一个列表放置在 Spark 默认配置文件中,从而允许用户轻松地从命令行添加其他插件,而无需覆盖配置文件的列表。 重复的插件将被忽略。