监控与检测
有几种方法可以监控 Spark 应用程序:Web UI、指标和外部检测。
Web 界面
每个 SparkContext 默认在端口 4040 上启动一个 Web UI,显示关于应用程序的有用信息。这包括:
- 调度器阶段和任务的列表
- RDD 大小和内存使用的摘要
- 环境信息。
- 关于正在运行的 executors 的信息
您可以通过在 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.enabled
和 spark.eventLog.rolling.maxFileSize
可以让您拥有滚动事件日志文件,而不是单个巨大的事件日志文件,这可能有助于某些情况,但它仍然无法帮助您减少日志的总体大小。
Spark 历史服务器可以通过在 Spark 历史服务器上设置配置 spark.history.fs.eventLog.rolling.maxFilesToRetain
来对滚动事件日志文件应用压缩,以减少日志的总体大小。
详细信息将在下面描述,但请事先注意压缩是*有损*操作。压缩会丢弃某些事件,这些事件将不再在 UI 上显示 - 您可能需要在启用该选项之前检查哪些事件将被丢弃。
当压缩发生时,历史服务器列出应用程序的所有可用事件日志文件,并将索引小于将保留的具有最小索引的文件的事件日志文件视为压缩的目标。例如,如果应用程序 A 有 5 个事件日志文件,并且 spark.history.fs.eventLog.rolling.maxFilesToRetain
设置为 2,那么将选择前 3 个日志文件进行压缩。
一旦它选择了目标,它就会分析它们以确定哪些事件可以排除,并将它们重写为一个紧凑的文件,并丢弃决定排除的事件。
压缩尝试排除指向过时数据的事件。截至目前,下面描述了要排除的事件的候选对象:
- 已完成的作业的事件以及相关的阶段/任务事件
- 已终止的 executor 的事件
- 已完成的 SQL 执行的事件以及相关的作业/阶段/任务事件
重写完成后,将尽最大努力删除原始日志文件。历史服务器可能无法删除原始日志文件,但这不会影响历史服务器的运行。
请注意,如果 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 中,都可以通过单击其标题对表格进行排序,从而可以轻松识别缓慢的任务、数据倾斜等。
注意
-
History Server 显示已完成和未完成的 Spark 作业。 如果应用程序在失败后进行了多次尝试,则将显示失败的尝试,以及任何正在进行的未完成尝试或最终成功的尝试。
-
未完成的应用程序仅间歇性地更新。 更新之间的时间由检查已更改文件的间隔(
spark.history.fs.update.interval
)定义。 在较大的集群上,更新间隔可以设置为较大的值。 查看正在运行的应用程序的方式实际上是查看其自己的 Web UI。 -
未注册为已完成而退出的应用程序将被列为未完成 - 即使它们不再运行。 如果应用程序崩溃,可能会发生这种情况。
-
发出 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 保证:
- 端点永远不会从一个版本中删除
- 对于任何给定的端点,单个字段永远不会被删除
- 可以添加新的端点
- 可以向现有端点添加新的字段
- 未来可能会添加新的 API 版本,作为单独的端点(例如,
api/v2
)。 新版本不要求向后兼容。 - API 版本可能会被删除,但只有在新 API 版本共存至少一个小的版本之后。
请注意,即使在检查正在运行的应用程序的 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 组件相对应的不同实例。 在每个实例中,您可以配置一组接收器,指标将报告给这些接收器。 当前支持以下实例:
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 类型的指标。 大多数指标在其父组件实例配置后立即处于活动状态,某些指标还需要通过其他配置参数启用,详细信息在列表中报告。
组件实例 = Driver
这是具有最多检测指标的组件。
- 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
- 注意:这些指标仅在本地模式下的驱动程序中可用。
- 在此命名空间中可用指标的完整列表可以在 Executor 组件实例的相应条目中找到。
- namespace=ExecutorMetrics
- 注意:这些指标取决于配置参数:
spark.metrics.executorMetricsSource.enabled
(默认为 true) - 此源包含与内存相关的指标。 在此命名空间中可用指标的完整列表可以在 Executor 组件实例的相应条目中找到。
- 注意:这些指标取决于配置参数:
- 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 中的信息,请参阅下面的“高级检测”。
组件实例 = Executor
这些指标由 Spark executor 公开。
- namespace=executor (指标类型为 counter 或 gauge)
- 备注
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 会作为 executor 和 driver 定期调度的心跳过程的一部分进行更新:
spark.executor.heartbeatInterval
(默认值为 10 秒) - 对于 executor 内存指标,可以使用更快的轮询机制,可以通过使用配置参数
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) - 此源适用于 driver 和 executor 实例,也适用于其他实例。
- 此源使用 Dropwizard/Codahale Metric Sets for JVM instrumentation 提供关于 JVM 指标的信息,特别是指标集 BufferPoolMetricSet、GarbageCollectorMetricSet 和 MemoryUsageGaugeSet。
组件实例 = applicationMaster
注意:适用于在 YARN 上运行
- numContainersPendingAllocate
- numExecutorsFailed
- numExecutorsRunning
- numLocalityAwareTasks
- numReleasedContainers
组件实例 = mesos_cluster
注意:适用于在 mesos 上运行
- waitingDrivers
- launchedDrivers
- retryDrivers
组件实例 = master
注意:适用于在 Spark standalone 中作为 master 运行
- workers
- aliveWorkers
- apps
- waitingApps
组件实例 = ApplicationSource
注意:适用于在 Spark standalone 中作为 master 运行
- status
- runtime_ms
- cores
组件实例 = worker
注意:适用于在 Spark standalone 中作为 worker 运行
- executors
- coresUsed
- memUsed_MB
- coresFree
- memFree_MB
组件实例 = shuffleService
注意:适用于 shuffle 服务
- blockTransferRate (meter) - 正在传输的块的速率
- blockTransferMessageRate (meter) - 块传输消息的速率,即,如果启用了批量获取,则表示批次的数量而不是块的数量
- blockTransferRateBytes (meter)
- blockTransferAvgTime_1min (gauge - 1 分钟移动平均值)
- numActiveConnections.count
- numRegisteredConnections.count
- numCaughtExceptions.count
- openBlockRequestLatencyMillis (histogram)
- registerExecutorRequestLatencyMillis (histogram)
- registeredExecutorsSize
- shuffle-server.usedDirectMemory
-
shuffle-server.usedHeapMemory
- 注意: 以下指标适用于服务器端配置
spark.shuffle.push.server.mergedShuffleFileManagerImpl
设置为org.apache.spark.network.shuffle.MergedShuffleFileManager
以进行基于推送的 Shuffle - blockBytesWritten - 写入文件中推送的块数据的大小,以字节为单位
- blockAppendCollisions - shuffle 服务中发生的 shuffle 推送块冲突的数量,因为正在写入同一 reduce 分区的另一个块
- lateBlockPushes - 在特定的 shuffle 合并完成后,在 shuffle 服务中收到的 shuffle 推送块的数量
- deferredBlocks - 当前缓存在内存中的延迟块部分的数量
- deferredBlockBytes - 当前缓存在内存中的延迟块部分的大小
- staleBlockPushes - 过时的 shuffle 块推送请求的数量
- ignoredBlockBytes - 传输到 ESS 但被忽略的推送块数据的大小。 当满足以下条件时,推送的块数据被认为是忽略的:1. 在 shuffle 完成后收到;2. 当推送请求是针对重复块时;3. ESS 无法写入块。
高级检测
可以使用多种外部工具来帮助分析 Spark 作业的性能
- 集群范围的监控工具,例如 Ganglia,可以提供对整体集群利用率和资源瓶颈的洞察。 例如,Ganglia 仪表板可以快速显示特定工作负载是受磁盘限制、受网络限制还是受 CPU 限制。
- OS 分析工具,例如 dstat、iostat 和 iotop,可以提供对单个节点的细粒度分析。
- JVM 实用程序,例如提供堆栈跟踪的
jstack
、创建堆转储的jmap
、报告时间序列统计信息的jstat
以及用于以可视化方式浏览各种 JVM 属性的jconsole
对于熟悉 JVM 内部的人员非常有用。
Spark 还提供了一个插件 API,以便可以将自定义检测代码添加到 Spark 应用程序。 有两个配置键可用于将插件加载到 Spark 中
spark.plugins
spark.plugins.defaultList
两者都接受一个逗号分隔的类名列表,这些类名实现了 org.apache.spark.api.plugin.SparkPlugin
接口。 存在这两个名称,以便可以将一个列表放置在 Spark 默认配置文件中,从而允许用户轻松地从命令行添加其他插件,而无需覆盖配置文件的列表。 重复的插件将被忽略。