Web 用户界面
Apache Spark 提供了一套 Web 用户界面 (UI),您可以使用它们来监控 Spark 集群的状态和资源消耗。
目录
作业选项卡
“作业”选项卡显示 Spark 应用程序中所有作业的摘要页面,以及每个作业的详细信息页面。摘要页面显示高级信息,例如所有作业的状态、持续时间和进度,以及整体事件时间线。当您单击摘要页面上的某个作业时,您将看到该作业的详细信息页面。详细信息页面进一步显示事件时间线、DAG 可视化以及作业的所有阶段。
本节显示的信息为:
- 用户:当前 Spark 用户
- 总运行时间:Spark 应用程序启动以来的时间
- 调度模式:请参阅作业调度
- 每个状态的作业数量:活动、已完成、失败
- 事件时间线:按时间顺序显示与执行器(已添加、已删除)和作业相关的事件
- 按状态分组的作业的详细信息:显示作业的详细信息,包括作业 ID、描述(带有指向详细作业页面的链接)、提交时间、持续时间、阶段摘要和任务进度条
当您单击特定作业时,您可以看到该作业的详细信息。
作业详情
此页面显示由其作业 ID 标识的特定作业的详细信息。
- 作业状态:(正在运行、已成功、已失败)
- 每个状态的阶段数(活动、待处理、已完成、已跳过、已失败)
- 关联的 SQL 查询:指向此作业的 sql 选项卡的链接
- 事件时间线:按时间顺序显示与执行器(已添加、已删除)和作业阶段相关的事件
- DAG 可视化:此作业的有向无环图的直观表示,其中顶点表示 RDD 或数据帧,边表示要应用于 RDD 的操作。
sc.parallelize(1 to 100).toDF.count()
的 DAG 可视化示例
- 阶段列表(按状态分组:活动、待处理、已完成、已跳过和已失败)
- 阶段 ID
- 阶段的描述
- 提交时间戳
- 阶段的持续时间
- 任务进度条
- 输入:此阶段从存储中读取的字节数
- 输出:此阶段写入存储的字节数
- 随机读取:读取的总随机字节数和记录数,包括本地读取的数据和从远程执行器读取的数据
- 随机写入:为了在未来阶段由随机读取而写入磁盘的字节数和记录数
阶段选项卡
“阶段”选项卡显示一个摘要页面,其中显示 Spark 应用程序中所有作业的所有阶段的当前状态。
页面开头是摘要,其中包含按状态(活动、待处理、已完成、已跳过和已失败)统计的所有阶段的数量
之后是每个状态(活动、待处理、已完成、已跳过、已失败)的阶段的详细信息。在活动阶段,可以使用“终止”链接终止阶段。只有在失败的阶段,才会显示失败原因。可以通过单击描述来访问任务详细信息。
阶段详情
阶段详细信息页面首先显示所有任务的总时间、位置级别摘要、随机读取大小/记录数和关联的作业 ID 等信息。
还有一个有向无环图 (DAG) 的可视化表示,其中顶点表示 RDD 或数据帧,边表示要应用的操作。节点在 DAG 可视化中按操作范围分组,并标有操作范围名称(BatchScan、WholeStageCodegen、Exchange 等)。值得注意的是,整个阶段代码生成操作也使用代码生成 ID 进行注释。对于属于 Spark 数据帧或 SQL 执行的阶段,这允许将阶段执行详细信息交叉引用到 Web-UI SQL 选项卡页面中报告 SQL 计划图和执行计划的相关详细信息。
所有任务的汇总指标以表格和时间线的形式表示。
- 任务反序列化时间
- 任务的持续时间.
- **GC 时间**是 JVM 垃圾收集的总时间。
- **结果序列化时间**是在将任务结果发送回驱动程序之前,在执行器上序列化任务结果所花费的时间。
- **获取结果时间**是驱动程序从工作节点获取任务结果所花费的时间。
- **调度程序延迟**是任务等待调度执行的时间。
- **峰值执行内存**是在随机播放、聚合和连接期间创建的内部数据结构使用的最大内存。
- **随机读取大小/记录数**。读取的总随机字节数,包括本地读取的数据和从远程执行器读取的数据。
- **随机读取获取等待时间**是任务阻塞等待从远程机器读取随机数据所花费的时间。
- **随机远程读取**是从远程执行器读取的总随机字节数。
- **随机写入时间**是任务写入随机数据所花费的时间。
- **随机溢出(内存)**是内存中随机数据的反序列化形式的大小。
- **随机溢出(磁盘)**是磁盘上数据的序列化形式的大小。
按执行器聚合的指标显示按执行器聚合的相同信息。
**累加器**是一种共享变量。它提供了一个可变变量,可以在各种转换中更新。可以使用和不使用名称创建累加器,但只显示命名的累加器。
任务详细信息基本上包含与摘要部分相同的信息,但按任务详细列出。它还包括查看日志的链接,以及如果任务由于任何原因失败,则包括任务尝试次数。如果有命名的累加器,则可以在此处查看每个任务结束时的累加器值。
存储选项卡
“存储”选项卡显示应用程序中持久化的 RDD 和数据帧(如果有)。摘要页面显示所有 RDD 的存储级别、大小和分区,详细信息页面显示 RDD 或数据帧中所有分区的大小和使用执行器。
运行上述示例后,我们可以在“存储”选项卡中找到列出的两个 RDD。提供了存储级别、分区数和内存开销等基本信息。请注意,新持久化的 RDD 或数据帧在具体化之前不会显示在选项卡中。要监控特定的 RDD 或数据帧,请确保已触发操作操作。
您可以单击 RDD 名称“rdd”以获取数据持久性的详细信息,例如集群上的数据分布。
环境选项卡
“环境”选项卡显示不同环境和配置变量的值,包括 JVM、Spark 和系统属性。
此环境页面分为五个部分。这是一个检查您的属性是否已正确设置的好地方。第一部分“运行时信息”仅包含运行时属性,例如 Java 和 Scala 的版本。第二部分“Spark 属性”列出了应用程序属性,例如“spark.app.name”和“spark.driver.memory”。
单击“Hadoop 属性”链接将显示与 Hadoop 和 YARN 相关的属性。请注意,“spark.hadoop.*”等属性不会显示在此部分中,而是显示在“Spark 属性”中。
“系统属性”显示有关 JVM 的更多详细信息。
最后一部分“类路径条目”列出了从不同来源加载的类,这对于解决类冲突非常有用。
执行器选项卡
“执行器”选项卡显示为应用程序创建的执行器的摘要信息,包括内存和磁盘使用情况以及任务和随机播放信息。“存储内存”列显示用于缓存数据的内存量和保留的内存量。
“执行器”选项卡不仅提供资源信息(每个执行器使用的内存、磁盘和核心数量),还提供性能信息(GC 时间和随机播放信息)。
单击执行器 0 的“stderr”链接将在其控制台中显示详细的标准错误日志。
单击执行器 0 的“线程转储”链接将显示执行器 0 上 JVM 的线程转储,这对于性能分析非常有用。
SQL 选项卡
如果应用程序执行 Spark SQL 查询,“SQL”选项卡将显示信息,例如查询的持续时间、作业以及物理和逻辑计划。这里我们包含一个基本示例来说明此选项卡
现在,上述三个数据帧/SQL 运算符显示在列表中。如果我们单击最后一个查询的“在 <console> 中显示:24”链接,我们将看到查询执行的 DAG 和详细信息。
查询详情页面显示有关查询执行时间、持续时间、关联作业列表和查询执行 DAG 的信息。 第一块“WholeStageCodegen (1)”将多个运算符(“LocalTableScan”和“HashAggregate”)一起编译成单个 Java 函数以提高性能,并且块中列出了行数和溢出大小等指标。 块名称中的注释“(1)”是代码生成 ID。 第二个块“Exchange”显示了随机交换的指标,包括写入的随机记录数、总数据大小等。
单击底部的“详细信息”链接将显示逻辑计划和物理计划,它们说明了 Spark 如何解析、分析、优化和执行查询。 受整个阶段代码生成优化约束的物理计划中的步骤以星号开头,后跟代码生成 ID,例如:“*(1) LocalTableScan”
SQL 指标
SQL 运算符的指标显示在物理运算符块中。 当我们想深入了解每个运算符的执行细节时,SQL 指标非常有用。 例如,“输出行数”可以回答在 Filter 运算符之后输出多少行,Exchange 运算符中的“写入的随机字节总数”显示了随机写入的字节数。
以下是 SQL 指标列表
SQL 指标 | 含义 | 运算符 |
---|---|---|
输出行数 | 运算符的输出行数 | 聚合运算符、连接运算符、样本、范围、扫描运算符、过滤器等。 |
数据大小 | 运算符的广播/随机/收集数据的大小 | BroadcastExchange、ShuffleExchange、子查询 |
收集时间 | 花费在收集数据上的时间 | BroadcastExchange、子查询 |
扫描时间 | 花费在扫描数据上的时间 | ColumnarBatchScan、FileSourceScan |
元数据时间 | 花费在获取元数据上的时间,例如分区数、文件数 | FileSourceScan |
写入的随机字节数 | 写入的字节数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
写入的随机记录数 | 写入的记录数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
随机写入时间 | 花费在随机写入上的时间 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
远程读取的块数 | 远程读取的块数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
远程读取的字节数 | 远程读取的字节数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
远程读取到磁盘的字节数 | 从远程读取到本地磁盘的字节数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
本地读取的块数 | 本地读取的块数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
本地读取的字节数 | 本地读取的字节数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
获取等待时间 | 花费在获取数据(本地和远程)上的时间 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
读取的记录数 | 读取的记录数 | CollectLimit、TakeOrderedAndProject、ShuffleExchange |
排序时间 | 花费在排序上的时间 | 排序 |
峰值内存 | 运算符中的峰值内存使用量 | 排序、HashAggregate |
溢出大小 | 运算符中从内存溢出到磁盘的字节数 | 排序、HashAggregate |
聚合构建时间 | 花费在聚合上的时间 | HashAggregate、ObjectHashAggregate |
平均哈希探测桶列表迭代次数 | 聚合期间每次查找的平均桶列表迭代次数 | HashAggregate |
构建侧的数据大小 | 构建的哈希图的大小 | ShuffledHashJoin |
构建哈希图的时间 | 花费在构建哈希图上的时间 | ShuffledHashJoin |
任务提交时间 | 写入成功后花费在提交任务输出上的时间 | 对基于文件的表的任何写入操作 |
作业提交时间 | 写入成功后花费在提交作业输出上的时间 | 对基于文件的表的任何写入操作 |
发送到 Python 工作进程的数据 | 发送到 Python 工作进程的序列化数据的字节数 | ArrowEvalPython、AggregateInPandas、BatchEvalPython、FlatMapGroupsInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
从 Python 工作进程返回的数据 | 从 Python 工作进程接收回的序列化数据的字节数 | ArrowEvalPython、AggregateInPandas、BatchEvalPython、FlatMapGroupsInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
结构化流选项卡
在微批处理模式下运行结构化流式处理作业时,Web UI 上将提供“结构化流式处理”选项卡。 概览页面显示了一些有关正在运行和已完成查询的简要统计信息。 此外,您还可以查看失败查询的最新异常。 有关详细统计信息,请单击表格中的“运行 ID”。
统计信息页面显示了一些有用的指标,可让您深入了解流式查询的状态。 目前,它包含以下指标。
- **输入速率。** 数据到达的聚合(跨所有源)速率。
- **处理速率。** Spark 处理数据的聚合(跨所有源)速率。
- **输入行。** 在触发器中处理的聚合(跨所有源)记录数。
- **批处理持续时间。** 每个批处理的处理持续时间。
- **操作持续时间。** 执行各种操作所花费的时间(以毫秒为单位)。 跟踪的操作如下所示。
- addBatch:从源读取微批处理的输入数据、对其进行处理并将批处理的输出写入接收器所花费的时间。 这应该占用微批处理的大部分时间。
- getBatch:准备逻辑查询以从源读取当前微批处理的输入所花费的时间。
- latestOffset 和 getOffset:查询此源的最大可用偏移量所花费的时间。
- queryPlanning:生成执行计划所花费的时间。
- walCommit:将偏移量写入元数据日志所花费的时间。
- **全局水印差距。** 批处理时间戳和批处理的全局水印之间的差距。
- **聚合的总状态行数。** 聚合的总状态行数。
- **聚合的更新状态行数。** 聚合的更新状态行数。
- **聚合的状态内存使用量(以字节为单位)。** 聚合的状态内存使用量(以字节为单位)。
- **按水印删除的聚合状态行数。** 按水印删除的聚合状态行数。
作为早期版本,统计信息页面仍在开发中,并将在未来版本中得到改进。
流(DStreams)选项卡
如果应用程序将 Spark Streaming 与 DStream API 一起使用,则 Web UI 包含“流式处理”选项卡。 此选项卡显示数据流中每个微批处理的调度延迟和处理时间,这对于对流式处理应用程序进行故障排除非常有用。
JDBC/ODBC 服务器选项卡
当 Spark 作为分布式 SQL 引擎运行时,我们可以看到此选项卡。 它显示有关会话和已提交 SQL 操作的信息。
页面的第一部分显示有关 JDBC/ODBC 服务器的常规信息:启动时间和正常运行时间。
第二部分包含有关活动会话和已完成会话的信息。
- 连接的**用户**和**IP**。
- **会话 ID**链接,用于访问会话信息。
- 会话的**开始时间**、**结束时间**和**持续时间**。
- **总执行次数**是在此会话中提交的操作数。
第三部分包含已提交操作的 SQL 统计信息。
- 提交操作的**用户**。
- **作业 ID**链接到作业选项卡。
- 将所有作业分组在一起的查询的**组 ID**。 应用程序可以使用此组 ID 取消所有正在运行的作业。
- 操作的**开始时间**。
- 执行的**结束时间**,在获取结果之前。
- 获取结果后操作的**关闭时间**。
- **执行时间**是结束时间和开始时间之间的差。
- **持续时间**是关闭时间和开始时间之间的差。
- **语句**是正在执行的操作。
- 进程的**状态**。
- *已启动*,进程开始时的第一个状态。
- *已编译*,已生成执行计划。
- *失败*,执行失败或出错完成时的最终状态。
- *已取消*,执行被取消时的最终状态。
- *已完成*处理并等待获取结果。
- *已关闭*,客户端关闭语句时的最终状态。
- 执行计划的**详细信息**,包括已解析的逻辑计划、已分析的逻辑计划、已优化的逻辑计划和物理计划,或 SQL 语句中的错误。