监控与仪表盘

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

Web 界面

每个 SparkContext 都会启动一个 Web UI,默认情况下在端口 4040 上,它会显示有关应用程序的有用信息。这包括

您只需在 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 History Server 中更新时都需要大量资源来回放。

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

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

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

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

一旦它选择了目标,它就会分析它们以确定哪些事件可以被排除,并将它们重新写入一个压缩文件,同时丢弃决定要排除的事件。

压缩尝试排除指向过时数据的事件。截至目前,以下是将被排除的事件的候选者

重写完成后,将以尽力而为的方式删除原始日志文件。History Server 可能无法删除原始日志文件,但这不会影响 History Server 的操作。

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

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

Spark History Server 配置选项

有关 Spark History Server 的安全选项的更多详细信息,请参阅 安全 页面。

属性名称 默认值 含义 自版本
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 时,指定 History Server 的 Kerberos 主体名称。 1.0.1
spark.history.kerberos.keytab (none) spark.history.kerberos.enabled=true 时,指定 History Server 的 Kerberos 密钥表文件的位置。 1.0.1
spark.history.fs.cleaner.enabled false 指定 History Server 是否应该定期清理存储中的事件日志。 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% 历史服务器用于处理事件日志的线程数。 2.0.0
spark.history.store.maxDiskUsage 10g 用于存储缓存应用程序历史信息的本地目录的最大磁盘使用量。 2.3.0
spark.history.store.path (none) 缓存应用程序历史数据的本地目录。如果设置,历史服务器将应用程序数据存储在磁盘上,而不是将其保存在内存中。写入磁盘的数据将在历史服务器重启时重新使用。 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 执行器日志 URL,用于支持外部日志服务,而不是在历史服务器中使用集群管理器的应用程序日志 URL。Spark 将通过模式支持一些路径变量,这些模式可能因集群管理器而异。请查看集群管理器的文档以查看支持哪些模式(如果有)。此配置对实时应用程序没有影响,它只影响历史服务器。

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

3.0.0
spark.history.custom.executor.log.url.applyIncompleteApplication true 指定是否将自定义 Spark 执行器日志 URL 也应用于不完整的应用程序。如果应将运行应用程序的执行器日志提供为原始日志 URL,请将其设置为 `false`。请注意,不完整的应用程序可能包括未正常关闭的应用程序。即使将其设置为 `true`,此配置对实时应用程序也没有影响,它只影响历史服务器。 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. 历史服务器显示已完成和未完成的 Spark 作业。如果应用程序在失败后进行多次尝试,则将显示失败的尝试,以及任何正在进行的未完成尝试或最终成功的尝试。

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

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

  4. 指示 Spark 作业完成的一种方法是显式停止 Spark 上下文(sc.stop()),或在 Python 中使用 with SparkContext() as sc: 结构来处理 Spark 上下文的设置和拆卸。

REST API

除了在 UI 中查看指标外,它们还可以作为 JSON 获取。这为开发人员提供了一种简单的方法来创建新的可视化和监控工具以用于 Spark。JSON 可用于运行的应用程序和历史服务器。端点安装在 /api/v1 上。例如,对于历史服务器,它们通常可以在 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 给定活动执行器中运行的所有线程的堆栈跟踪。历史服务器不可用。
/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 (default) | false] 列出/隐藏 Spark 计划节点的详细信息。
?planDescription=[true (default) | false] 在物理计划大小很大时按需启用/禁用物理 planDescription
?offset=[offset]&length=[len] 列出给定范围内的查询。
/applications/[app-id]/sql/[execution-id] 给定查询的详细信息。
?details=[true (default) | false] 除了给定查询详细信息外,还列出/隐藏指标详细信息。
?planDescription=[true (default) | false] 在物理计划大小很大时按需启用/禁用给定查询的物理 planDescription
/applications/[app-id]/environment 给定应用程序的环境详细信息。
/version 获取当前的 Spark 版本。

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

执行器任务指标

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

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

执行器指标

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

执行器级指标名称 简短描述
rddBlocks 此执行器的块管理器中的 RDD 块。
memoryUsed 此执行器使用的存储内存。
diskUsed 此执行器用于 RDD 存储的磁盘空间。
totalCores 此执行器中可用的核心数。
maxTasks 此执行器中可以同时运行的任务的最大数量。
activeTasks 当前正在执行的任务数。
failedTasks 此执行器中失败的任务数。
completedTasks 此执行器中已完成的任务数。
totalTasks 此执行器中总的任务数(正在运行、失败和已完成)。
totalDuration JVM 在此执行器中执行任务所花费的时间。该值以毫秒表示。
totalGCTime JVM 在此执行器中花费在垃圾回收上的时间总和。该值以毫秒表示。
totalInputBytes 在此执行器中总的输入字节数。
totalShuffleRead 在此执行器中总的混洗读取字节数。
totalShuffleWrite 在此执行器中总的混洗写入字节数。
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 总的次要 GC 计数。例如,垃圾收集器是 Copy、PS Scavenge、ParNew、G1 Young Generation 等等之一。
    .MinorGCTime 总的次要 GC 时间。该值以毫秒表示。
    .MajorGCCount 总的主要 GC 计数。例如,垃圾收集器是 MarkSweepCompact、PS MarkSweep、ConcurrentMarkSweep、G1 Old Generation 等等之一。
    .MajorGCTime 总的主要 GC 时间。该值以毫秒表示。

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

API 版本控制策略

这些端点已进行严格的版本控制,以便更轻松地在端点之上开发应用程序。特别是,Spark 保证

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

指标

Spark 具有基于 Dropwizard Metrics 库 的可配置指标系统。这允许用户将 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)很难做到,因为应用程序 ID 会随着每次调用应用程序而改变。对于此类用例,可以使用 spark.metrics.namespace 配置属性为指标报告指定自定义命名空间。例如,如果用户希望将指标命名空间设置为应用程序的名称,他们可以将 spark.metrics.namespace 属性设置为类似于 ${spark.app.name} 的值。然后,Spark 会适当地扩展此值,并将其用作指标系统的根命名空间。非驱动程序和执行器指标永远不会以 spark.app.id 为前缀,spark.metrics.namespace 属性也不会对这些指标产生任何影响。

Spark 的指标被解耦成不同的实例,对应于 Spark 组件。在每个实例中,您可以配置一组将指标报告到的接收器。接收器包含在 org.apache.spark.metrics.sink 包中

每个实例都可以报告到零个或多个接收器。接收器包含在 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 类型的指标。绝大多数指标在其父组件实例配置后立即生效,某些指标还需要通过其他配置参数启用,详细信息在列表中报告。

组件实例 = 驱动程序

这是具有大量检测指标的组件

组件实例 = 执行器

这些指标由 Spark 执行器公开。

来源 = JVM 来源

备注

组件实例 = applicationMaster

注意:适用于在 YARN 上运行时

组件实例 = mesos_cluster

注意:适用于在 Mesos 上运行时

组件实例 = 主节点

注意:适用于在 Spark 独立模式下作为主节点运行时

组件实例 = ApplicationSource

注意:适用于在 Spark 独立模式下作为主节点运行时

组件实例 = 工作节点

注意:适用于在 Spark 独立模式下作为工作节点运行时

组件实例 = shuffleService

注意:适用于混洗服务

高级仪表盘

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

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

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