监控与仪表盘
有几种方法可以监控 Spark 应用程序:Web UI、指标和外部仪表盘。
Web 界面
每个 SparkContext 都会启动一个 Web UI,默认情况下在端口 4040 上,它会显示有关应用程序的有用信息。这包括
- 调度程序阶段和任务的列表
- RDD 大小和内存使用情况的摘要
- 环境信息。
- 有关正在运行的执行器的信息
您只需在 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.enabled
和 spark.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 个日志文件将被选中进行压缩。
一旦它选择了目标,它就会分析它们以确定哪些事件可以被排除,并将它们重新写入一个压缩文件,同时丢弃决定要排除的事件。
压缩尝试排除指向过时数据的事件。截至目前,以下是将被排除的事件的候选者
- 已完成作业的事件以及相关的阶段/任务事件
- 已终止执行器的事件
- 已完成的 SQL 执行的事件以及相关的作业/阶段/任务事件
重写完成后,将以尽力而为的方式删除原始日志文件。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 中,表格可以通过单击其标题进行排序,从而可以轻松识别缓慢的任务、数据倾斜等。
注意
-
历史服务器显示已完成和未完成的 Spark 作业。如果应用程序在失败后进行多次尝试,则将显示失败的尝试,以及任何正在进行的未完成尝试或最终成功的尝试。
-
不完整的应用程序仅间歇性更新。更新之间的时间间隔由检查更改文件的间隔定义(
spark.history.fs.update.interval
)。在较大的集群中,更新间隔可能设置为较大的值。查看正在运行的应用程序的方法实际上是查看其自己的 Web UI。 -
退出而未将其自身注册为已完成的应用程序将被列为不完整,即使它们不再运行。如果应用程序崩溃,可能会发生这种情况。
-
指示 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 保证
- 端点永远不会从一个版本中删除
- 对于任何给定的端点,单个字段永远不会被删除
- 可以添加新的端点
- 可以向现有端点添加新字段
- 将来可能会添加新版本的 API 作为单独的端点(例如,
api/v2
)。新版本不需要向后兼容。 - API 版本可能会被删除,但只有在与新 API 版本共存至少一个次要版本之后才会删除。
请注意,即使在检查正在运行的应用程序的 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
包中
master
:Spark 独立主进程。applications
:主进程中报告各种应用程序的组件。worker
:Spark 独立工作进程。executor
:Spark 执行器。driver
:Spark 驱动程序进程(创建 SparkContext 的进程)。shuffleService
:Spark shuffle 服务。applicationMaster
:在 YARN 上运行时的 Spark ApplicationMaster。mesos_cluster
:在 Mesos 上运行时的 Spark 集群调度程序。
每个实例都可以报告到零个或多个接收器。接收器包含在 org.apache.spark.metrics.sink
包中
ConsoleSink
:将指标信息记录到控制台。CSVSink
:定期将指标数据导出到 CSV 文件。JmxSink
:注册指标以便在 JMX 控制台中查看。MetricsServlet
:在现有的 Spark UI 中添加一个 servlet,以 JSON 数据形式提供指标数据。PrometheusServlet
:(实验性)在现有的 Spark UI 中添加一个 servlet,以 Prometheus 格式提供指标数据。GraphiteSink
:将指标发送到 Graphite 节点。Slf4jSink
:将指标作为日志条目发送到 slf4j。StatsdSink
:将指标发送到 StatsD 节点。
Spark 还支持 Ganglia 接收器,但由于许可限制,它未包含在默认构建中
GangliaSink
:将指标发送到 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 类型的指标。绝大多数指标在其父组件实例配置后立即生效,某些指标还需要通过其他配置参数启用,详细信息在列表中报告。
组件实例 = 驱动程序
这是具有大量检测指标的组件
- namespace=BlockManager
- disk.diskSpaceUsed_MB
- memory.maxMem_MB
- memory.maxOffHeapMem_MB
- memory.maxOnHeapMem_MB
- memory.memUsed_MB
- memory.offHeapMemUsed_MB
- memory.onHeapMemUsed_MB
- memory.remainingMem_MB
- memory.remainingOffHeapMem_MB
- memory.remainingOnHeapMem_MB
- namespace=HiveExternalCatalog
- 注意:这些指标取决于配置参数:
spark.metrics.staticSources.enabled
(默认值为 true) - fileCacheHits.count
- filesDiscovered.count
- hiveClientCalls.count
- parallelListingJobCount.count
- partitionsFetched.count
- 注意:这些指标取决于配置参数:
- namespace=CodeGenerator
- 注意:这些指标取决于配置参数:
spark.metrics.staticSources.enabled
(默认值为 true) - compilationTime (histogram)
- generatedClassSize (histogram)
- generatedMethodSize (histogram)
- sourceCodeSize (histogram)
- 注意:这些指标取决于配置参数:
- namespace=DAGScheduler
- job.activeJobs
- job.allJobs
- messageProcessingTime (timer)
- stage.failedStages
- stage.runningStages
- stage.waitingStages
- namespace=LiveListenerBus
- listenerProcessingTime.org.apache.spark.HeartbeatReceiver (timer)
- listenerProcessingTime.org.apache.spark.scheduler.EventLoggingListener (timer)
- listenerProcessingTime.org.apache.spark.status.AppStatusListener (timer)
- numEventsPosted.count
- queue.appStatus.listenerProcessingTime (timer)
- queue.appStatus.numDroppedEvents.count
- queue.appStatus.size
- queue.eventLog.listenerProcessingTime (timer)
- queue.eventLog.numDroppedEvents.count
- queue.eventLog.size
- queue.executorManagement.listenerProcessingTime (timer)
- namespace=appStatus (所有指标类型为=counter)
- 注意:在 Spark 3.0 中引入。取决于配置参数:
spark.metrics.appStatusSource.enabled
(默认值为 false) - stages.failedStages.count
- stages.skippedStages.count
- stages.completedStages.count
- tasks.blackListedExecutors.count // 已弃用,请改用 excludedExecutors
- tasks.excludedExecutors.count
- tasks.completedTasks.count
- tasks.failedTasks.count
- tasks.killedTasks.count
- tasks.skippedTasks.count
- tasks.unblackListedExecutors.count // 已弃用,请改用 unexcludedExecutors
- tasks.unexcludedExecutors.count
- jobs.succeededJobs
- jobs.failedJobs
- jobDuration
- 注意:在 Spark 3.0 中引入。取决于配置参数:
- namespace=AccumulatorSource
- 注意:用户可配置的源,用于将累加器附加到指标系统
- DoubleAccumulatorSource
- LongAccumulatorSource
- namespace=spark.streaming
- 注意:这仅适用于 Spark 结构化流。取决于配置参数:
spark.sql.streaming.metricsEnabled=true
(默认值为 false) - eventTime-watermark
- inputRate-total
- latency
- processingRate-total
- states-rowsTotal
- states-usedBytes
- 注意:这仅适用于 Spark 结构化流。取决于配置参数:
- namespace=JVMCPU
- jvmCpuTime
- namespace=executor
- 注意:这些指标仅在本地模式下在驱动程序中可用。
- 可以在执行器组件实例的相应条目中找到此命名空间中可用指标的完整列表。
- namespace=ExecutorMetrics
- 注意:这些指标取决于配置参数:
spark.metrics.executorMetricsSource.enabled
(默认值为 true) - 此源包含与内存相关的指标。可以在执行器组件实例的相应条目中找到此命名空间中可用指标的完整列表。
- 注意:这些指标取决于配置参数:
- namespace=ExecutorAllocationManager
- 注意:这些指标仅在使用动态分配时发出。取决于配置参数
spark.dynamicAllocation.enabled
(默认值为 false) - executors.numberExecutorsToAdd
- executors.numberExecutorsPendingToRemove
- executors.numberAllExecutors
- executors.numberTargetExecutors
- executors.numberMaxNeededExecutors
- executors.numberDecommissioningExecutors
- executors.numberExecutorsGracefullyDecommissioned.count
- executors.numberExecutorsDecommissionUnfinished.count
- executors.numberExecutorsExitedUnexpectedly.count
- executors.numberExecutorsKilledByDriver.count
- 注意:这些指标仅在使用动态分配时发出。取决于配置参数
- namespace=plugin.<插件类名>
- 可选命名空间。此命名空间中的指标由用户提供的代码定义,并使用 Spark 插件 API 配置。有关如何将自定义插件加载到 Spark 中的信息,请参见下面的“高级仪表盘”。
组件实例 = 执行器
这些指标由 Spark 执行器公开。
- namespace=executor(指标类型为计数器或量规)
- 备注
spark.executor.metrics.fileSystemSchemes
(默认值:file,hdfs
)确定公开的文件系统指标。
- bytesRead.count
- bytesWritten.count
- cpuTime.count
- deserializeCpuTime.count
- deserializeTime.count
- diskBytesSpilled.count
- filesystem.file.largeRead_ops
- filesystem.file.read_bytes
- filesystem.file.read_ops
- filesystem.file.write_bytes
- filesystem.file.write_ops
- filesystem.hdfs.largeRead_ops
- filesystem.hdfs.read_bytes
- filesystem.hdfs.read_ops
- filesystem.hdfs.write_bytes
- filesystem.hdfs.write_ops
- jvmGCTime.count
- memoryBytesSpilled.count
- recordsRead.count
- recordsWritten.count
- resultSerializationTime.count
- resultSize.count
- runTime.count
- shuffleBytesWritten.count
- shuffleFetchWaitTime.count
- shuffleLocalBlocksFetched.count
- shuffleLocalBytesRead.count
- shuffleRecordsRead.count
- shuffleRecordsWritten.count
- shuffleRemoteBlocksFetched.count
- shuffleRemoteBytesRead.count
- shuffleRemoteBytesReadToDisk.count
- shuffleTotalBytesRead.count
- shuffleWriteTime.count
- succeededTasks.count
- threadpool.activeTasks
- threadpool.completeTasks
- threadpool.currentPool_size
- threadpool.maxPool_size
- threadpool.startedTasks
- 备注
- namespace=ExecutorMetrics
- 备注
- 这些指标取决于一个配置参数:
spark.metrics.executorMetricsSource.enabled
(默认值为 true) - ExecutorMetrics 作为执行器和驱动程序定期安排的心跳过程的一部分进行更新:
spark.executor.heartbeatInterval
(默认值为 10 秒) - 对于执行器内存指标,可以使用可选的更快轮询机制,可以通过使用配置参数
spark.executor.metrics.pollingInterval
设置轮询间隔(以毫秒为单位)来激活它。
- 这些指标取决于一个配置参数:
- JVMHeapMemory
- JVMOffHeapMemory
- OnHeapExecutionMemory
- OnHeapStorageMemory
- OnHeapUnifiedMemory
- OffHeapExecutionMemory
- OffHeapStorageMemory
- OffHeapUnifiedMemory
- DirectPoolMemory
- MappedPoolMemory
- MinorGCCount
- MinorGCTime
- MajorGCCount
- MajorGCTime
- “ProcessTree*” 指标计数器
- ProcessTreeJVMVMemory
- ProcessTreeJVMRSSMemory
- ProcessTreePythonVMemory
- ProcessTreePythonRSSMemory
- ProcessTreeOtherVMemory
- ProcessTreeOtherRSSMemory
- 注意:“ProcessTree*” 指标仅在某些条件下收集。这些条件是以下条件的逻辑 AND:
/proc
文件系统存在,spark.executor.processTreeMetrics.enabled=true
。“ProcessTree*” 指标在未满足这些条件时报告 0。
- 备注
- namespace=JVMCPU
- jvmCpuTime
- namespace=NettyBlockTransfer
- shuffle-client.usedDirectMemory
- shuffle-client.usedHeapMemory
- shuffle-server.usedDirectMemory
- shuffle-server.usedHeapMemory
- namespace=HiveExternalCatalog
- 注意:这些指标取决于配置参数:
spark.metrics.staticSources.enabled
(默认值为 true) - fileCacheHits.count
- filesDiscovered.count
- hiveClientCalls.count
- parallelListingJobCount.count
- partitionsFetched.count
- 注意:这些指标取决于配置参数:
- namespace=CodeGenerator
- 注意:这些指标取决于配置参数:
spark.metrics.staticSources.enabled
(默认值为 true) - compilationTime (histogram)
- generatedClassSize (histogram)
- generatedMethodSize (histogram)
- sourceCodeSize (histogram)
- 注意:这些指标取决于配置参数:
- namespace=plugin.<插件类名>
- 可选命名空间。此命名空间中的指标由用户提供的代码定义,并使用 Spark 插件 API 配置。有关如何将自定义插件加载到 Spark 中的信息,请参见下面的“高级仪表盘”。
来源 = JVM 来源
备注
- 通过设置相关的
metrics.properties
文件条目或配置参数来激活此源:spark.metrics.conf.*.source.jvm.class=org.apache.spark.metrics.source.JvmSource
- 这些指标取决于一个配置参数:
spark.metrics.staticSources.enabled
(默认值为 true) - 此源可用于驱动程序和执行器实例,也可用于其他实例。
- 此源使用 Dropwizard/Codahale 用于 JVM 仪表盘的指标集,特别是指标集 BufferPoolMetricSet、GarbageCollectorMetricSet 和 MemoryUsageGaugeSet 提供有关 JVM 指标的信息。
组件实例 = applicationMaster
注意:适用于在 YARN 上运行时
- numContainersPendingAllocate
- numExecutorsFailed
- numExecutorsRunning
- numLocalityAwareTasks
- numReleasedContainers
组件实例 = mesos_cluster
注意:适用于在 Mesos 上运行时
- waitingDrivers
- launchedDrivers
- retryDrivers
组件实例 = 主节点
注意:适用于在 Spark 独立模式下作为主节点运行时
- workers
- aliveWorkers
- apps
- waitingApps
组件实例 = ApplicationSource
注意:适用于在 Spark 独立模式下作为主节点运行时
- status
- runtime_ms
- cores
组件实例 = 工作节点
注意:适用于在 Spark 独立模式下作为工作节点运行时
- executors
- coresUsed
- memUsed_MB
- coresFree
- memFree_MB
组件实例 = shuffleService
注意:适用于混洗服务
- blockTransferRate(仪表盘) - 块传输速率
- blockTransferMessageRate(仪表盘) - 块传输消息速率,即如果启用了批量获取,则表示批次数量而不是块数量
- blockTransferRateBytes(仪表盘)
- blockTransferAvgTime_1min(量规 - 1 分钟移动平均值)
- numActiveConnections.count
- numRegisteredConnections.count
- numCaughtExceptions.count
- openBlockRequestLatencyMillis(直方图)
- registerExecutorRequestLatencyMillis(直方图)
- registeredExecutorsSize
- shuffle-server.usedDirectMemory
-
shuffle-server.usedHeapMemory
- 注意:以下指标适用于服务器端配置
spark.shuffle.push.server.mergedShuffleFileManagerImpl
设置为org.apache.spark.network.shuffle.MergedShuffleFileManager
的基于推送的混洗 - blockBytesWritten - 推送到文件的推送块数据大小(以字节为单位)
- blockAppendCollisions - 在混洗服务中发生冲突的推送混洗块数量,因为正在写入同一减少分区中的另一个块
- lateBlockPushes - 在特定混洗合并完成之后,在混洗服务中接收到的推送混洗块数量
- deferredBlocks - 当前在内存中缓冲的延迟块部分的数量
- deferredBlockBytes - 当前在内存中缓冲的延迟块部分的大小
- staleBlockPushes - 过时的推送混洗块请求数量
- ignoredBlockBytes - 推送到 ESS 但被忽略的推送块数据的大小。当推送块数据被认为被忽略时:1. 它是在混洗完成之后接收到的;2. 当推送请求是针对重复块时;3. ESS 无法写入块。
高级仪表盘
可以使用多种外部工具来帮助分析 Spark 作业的性能
- 集群范围的监控工具(例如 Ganglia)可以提供对整个集群利用率和资源瓶颈的洞察。例如,Ganglia 仪表盘可以快速显示特定工作负载是磁盘绑定、网络绑定还是 CPU 绑定。
- 操作系统分析工具(例如 dstat、iostat 和 iotop)可以提供对单个节点的细粒度分析。
- JVM 工具(例如
jstack
用于提供堆栈跟踪、jmap
用于创建堆转储、jstat
用于报告时间序列统计信息以及jconsole
用于直观地浏览各种 JVM 属性)对于那些熟悉 JVM 内部结构的人来说非常有用。
Spark 还提供了一个插件 API,以便可以将自定义仪表盘代码添加到 Spark 应用程序中。有两个配置键可用于将插件加载到 Spark 中
spark.plugins
spark.plugins.defaultList
两者都采用逗号分隔的类名列表,这些类名实现 org.apache.spark.api.plugin.SparkPlugin
接口。这两个名称的存在是为了使一个列表可以放在 Spark 默认配置文件中,允许用户轻松地从命令行添加其他插件,而不会覆盖配置文件中的列表。重复的插件将被忽略。