网络用户界面
Apache Spark提供了一套Web用户界面(UIs),您可以使用它来监控您的Spark集群的状态和资源消耗。
目录
职位标签
作业选项卡显示了Spark应用程序中所有作业的摘要页面和每个作业的详细页面。摘要页面展示了高层次的信息,例如所有作业的状态、持续时间和进度,以及整体事件时间线。当您点击摘要页面上的一个作业时,将看到该作业的详细页面。详细页面进一步显示事件时间线、DAG可视化以及该作业的所有阶段。
在此部分显示的信息是
- 用户: 当前的 Spark 用户
- 总运行时间: 自 Spark 应用程序启动以来的时间
- 调度模式: 参见 作业调度
- 每个状态的作业数量: 活跃的, 已完成的, 失败的
- 事件时间线:按时间顺序显示与执行者(添加、删除)和作业相关的事件
- 按状态分组的工作详情:显示工作详细信息,包括工作ID、描述(带有指向详细工作页面的链接)、提交时间、持续时间、阶段摘要和任务进度条
当您点击一个特定的职位时,您可以看到该职位的详细信息。
职位详情
本页面显示了由其职位ID标识的特定职位的详细信息。
- 作业状态: (运行中, 成功, 失败)
- 每个状态的阶段数量 (活动, 待定, 完成, 跳过, 失败)
- 相关 SQL 查询: 链接到此作业的 sql 选项卡
- 事件时间线: 按时间顺序显示与执行器(添加、移除)及作业阶段相关的事件
- DAG 可视化:该作业的有向无环图的可视化表示,其中顶点代表 RDD 或 DataFrame,边表示要应用于 RDD 的操作。
-
对于
sc.parallelize(1 to 100).toDF.count()的 DAG 可视化示例
-
阶段列表(按状态分组:活动、待处理、已完成、跳过和失败)
- 阶段 ID
- 阶段描述
- 提交时间戳
- 阶段持续时间
- 任务进度条
- 输入:在此阶段从存储中读取的字节
- 输出:在此阶段写入存储的字节
- 洗牌读取:总的洗牌字节和读取的记录,包括本地读取的数据和来自远程执行器读取的数据
- 洗牌写入:写入磁盘的字节和记录,以便在未来的阶段被洗牌读取
阶段标签
阶段选项卡显示一个摘要页面,展示Spark应用中所有作业的所有阶段的当前状态。
页面开头是按状态(活动、待处理、完成、跳过和失败)统计的所有阶段摘要
之后是每个状态(活动、待处理、已完成、跳过、失败)的阶段详细信息。在活动阶段,可以通过kill链接终止该阶段。只有在失败阶段,才会显示失败原因。通过点击描述可以访问任务详细信息。
阶段详情
阶段详细页面开始于所有任务的总时间等信息, 局部性级别摘要 , 洗牌读取大小 / 记录 和相关的作业ID。
此阶段还有一个有向无环图 (DAG) 的可视化表示,其中顶点表示 RDD 或 DataFrame,边表示将要应用的操作。 节点根据操作范围在 DAG 可视化中进行分组,并标记为操作范围名称(BatchScan、WholeStageCodegen、Exchange 等)。 值得注意的是,整体阶段代码生成操作也标注了代码生成 ID。对于属于 Spark DataFrame 或 SQL 执行的阶段,这允许将阶段执行细节与 Web-UI SQL 标签页中报告的 SQL 计划图和执行计划的相关细节进行交叉参考。
所有任务的总结指标以表格和时间轴的形式呈现。
- 任务反序列化时间
- 任务持续时间 。
- 垃圾回收时间 是JVM垃圾回收的总时间。
- 结果序列化时间 是在执行器上序列化任务结果并发送回驱动程序之前所花费的时间。
- 获取结果时间 是驱动程序从工作节点获取任务结果所花费的时间。
- 调度延迟 是任务等待被调度执行的时间。
- 峰值执行内存 是运行过程中创建的内部数据结构在洗牌、聚合和连接期间使用的最大内存。
- 洗牌读取大小 / 记录 。总的洗牌字节读取量,包括从本地读取的数据和从远程执行器读取的数据。
- 洗牌读取获取等待时间 是任务被阻塞等待从远程机器读取洗牌数据的时间。
- 洗牌远程读取 是从远程执行器读取的总洗牌字节。
- 洗牌写入时间 是任务在写入洗牌数据上花费的时间。
- 洗牌溢出(内存) 是洗牌数据在内存中反序列化形式的大小。
- 洗牌溢出(磁盘) 是洗牌数据在磁盘上序列化形式的大小。
按执行器汇总的指标显示按执行器汇总的相同信息。
累加器 是一种共享变量。它提供了一个可变变量,可以在各种转换中进行更新。可以创建有名称和无名称的累加器,但只有命名的累加器会被显示。
任务详情基本上包含与摘要部分相同的信息,但按任务详细列出。它还包括查看日志的链接以及如果因某种原因失败的任务尝试编号。如果有命名累加器,这里可以看到每个任务结束时的累加器值。
存储选项卡
存储选项卡显示应用程序中持久化的 RDD 和 DataFrame(如果有的话)。摘要页面显示所有 RDD 的存储级别、大小和分区,而详细信息页面显示 RDD 或 DataFrame 中所有分区的大小和使用的执行器。
scala> import org.apache.spark.storage.StorageLevel._
import org.apache.spark.storage.StorageLevel._
scala> val rdd = sc.range(0, 100, 1, 5).setName("rdd")
rdd: org.apache.spark.rdd.RDD[Long] = rdd MapPartitionsRDD[1] at range at <console>:27
scala> rdd.persist(MEMORY_ONLY_SER)
res0: rdd.type = rdd MapPartitionsRDD[1] at range at <console>:27
scala> rdd.count
res1: Long = 100
scala> val df = Seq((1, "andy"), (2, "bob"), (2, "andy")).toDF("count", "name")
df: org.apache.spark.sql.DataFrame = [count: int, name: string]
scala> df.persist(DISK_ONLY)
res2: df.type = [count: int, name: string]
scala> df.count
res3: Long = 3
在运行上述示例后,我们可以在存储选项卡中找到列出的两个 RDD。提供了基本信息,如存储级别、分区数量和内存开销。请注意,新的持久化 RDD 或 DataFrame 在被具体化之前不会在选项卡中显示。要监控特定的 RDD 或 DataFrame,确保已触发一个行动操作。
您可以点击 RDD 名称 ‘rdd’ 以获取数据持久性的详细信息,例如集群上的数据分布。
环境选项卡
环境选项卡显示不同环境和配置变量的值,包括JVM、Spark和系统属性。
此环境页面分为五个部分。它是检查您属性是否正确设置的一个有用地方。第一部分“运行时信息”简单地包含了 运行时属性 ,例如Java和Scala的版本。第二部分“Spark属性”列出了 应用程序属性 ,例如 ‘spark.app.name’ 和‘spark.driver.memory’。
点击‘Hadoop Properties’链接将显示与Hadoop和YARN相关的属性。请注意,像 ‘spark.hadoop.*’ 这样的属性不是在这一部分显示,而是在‘Spark Properties’中显示。
‘系统属性’显示有关JVM的更多细节。
最后一部分‘Classpath Entries’列出了从不同来源加载的类,这对解决类冲突非常有用。
执行者选项卡
执行者选项卡显示有关为应用程序创建的执行者的摘要信息,包括内存和磁盘使用情况以及任务和洗牌信息。存储内存列显示用于缓存数据的内存使用量和保留量。
Executors选项卡不仅提供资源信息(每个执行器使用的内存、磁盘和核心数量),还提供性能信息( GC时间 和洗牌信息)。
点击执行器 0 的‘stderr’链接将在其控制台中显示详细的 标准错误日志 。
点击执行器 0 的‘Thread Dump’链接会显示执行器 0 上 JVM 的线程转储,这对于性能分析非常有用。
SQL 标签
如果应用程序执行Spark SQL查询,SQL选项卡将显示信息,例如持续时间、作业以及查询的物理和逻辑计划。在这里,我们包含一个基本示例来说明该选项卡:
scala> val df = Seq((1, "andy"), (2, "bob"), (2, "andy")).toDF("count", "name")
df: org.apache.spark.sql.DataFrame = [count: int, name: string]
scala> df.count
res0: Long = 3
scala> df.createGlobalTempView("df")
scala> spark.sql("select name,sum(count) from global_temp.df group by name").show
+----+----------+
|name|sum(count)|
+----+----------+
|andy| 3|
| bob| 2|
+----+----------+
现在,上述三个数据框/SQL操作符显示在列表中。如果我们点击最后一个查询的‘show at
查询详情页面显示有关查询执行时间、持续时间、相关作业列表以及查询执行DAG的信息。第一个块‘WholeStageCodegen (1)’将多个操作符(‘LocalTableScan’和‘HashAggregate’)编译成一个单一的Java函数以提高性能,并且块中列出了行数和溢出大小等指标。块名称中的注释‘(1)’是代码生成ID。第二个块‘Exchange’显示了有关洗牌交换的指标,包括写入的洗牌记录数量、总数据大小等。
点击底部的‘Details’链接将显示逻辑计划和物理计划,这些计划说明了Spark如何解析、分析、优化和执行查询。整个阶段代码生成优化下的物理计划步骤,以星号开头,后接代码生成ID,例如:‘*(1) LocalTableScan’
SQL指标
SQL操作符的指标显示在物理操作符的块中。当我们想要深入了解每个操作符的执行细节时,SQL指标可以很有用。例如,“输出行数”可以回答在过滤操作符后输出了多少行,“交换操作符中的洗牌字节总写入”显示了洗牌写入的字节数。
这是SQL指标的列表:
| SQL 指标 | 含义 | 操作符 |
|---|---|---|
number of output rows
|
操作符的输出行数 | 聚合操作符、连接操作符、取样、范围、扫描操作符、过滤等 |
data size
|
操作符的广播/洗牌/收集数据的大小 | BroadcastExchange, ShuffleExchange, Subquery |
time to collect
|
收集数据花费的时间 | BroadcastExchange, Subquery |
scan time
|
扫描数据花费的时间 | ColumnarBatchScan, FileSourceScan |
metadata time
|
获取元数据(如分区数量、文件数量)花费的时间 | FileSourceScan |
shuffle bytes written
|
写入的字节数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
shuffle records written
|
写入的记录数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
shuffle write time
|
洗牌写入花费的时间 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
remote blocks read
|
远程读取的块数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
remote bytes read
|
远程读取的字节数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
remote bytes read to disk
|
从远程读取到本地磁盘的字节数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
local blocks read
|
本地读取的块数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
local bytes read
|
本地读取的字节数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
fetch wait time
|
获取数据(本地和远程)花费的时间 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
records read
|
读取的记录数 | CollectLimit, TakeOrderedAndProject, ShuffleExchange |
sort time
|
排序花费的时间 | Sort |
peak memory
|
操作符的峰值内存使用量 | Sort, HashAggregate |
spill size
|
操作符中从内存溢出到磁盘的字节数 | Sort, HashAggregate |
time in aggregation build
|
聚合花费的时间 | HashAggregate, ObjectHashAggregate |
avg hash probe bucket list iters
|
聚合过程中每次查找的平均桶列表迭代次数 | HashAggregate |
data size of build side
|
构建的哈希映射的大小 | ShuffledHashJoin |
time to build hash map
|
构建哈希映射花费的时间 | ShuffledHashJoin |
task commit time
|
在写入成功后提交任务输出花费的时间 | 任何基于文件的表的写操作 |
job commit time
|
在写入成功后提交作业输出花费的时间 | 任何基于文件的表的写操作 |
data sent to Python workers
|
发送到 Python 工作者的序列化数据的字节数 | ArrowEvalPython, AggregateInPandas, BatchEvalPython, FlatMapGroupsInPandas, FlatMapsCoGroupsInPandas, FlatMapsCoGroupsInPandasWithState, MapInPandas, PythonMapInArrow, WindowsInPandas |
data returned from Python workers
|
从 Python 工作者接收到的序列化数据的字节数 | ArrowEvalPython, AggregateInPandas, BatchEvalPython, FlatMapGroupsInPandas, FlatMapsCoGroupsInPandas, FlatMapsCoGroupsInPandasWithState, MapInPandas, PythonMapInArrow, WindowsInPandas |
结构化流处理标签
在微批模式下运行结构化流作业时,Web UI上将提供一个结构化流选项卡。概览页面显示了正在运行和已完成查询的一些简单统计信息。此外,您可以查看失败查询的最新异常。要获取详细统计信息,请单击表格中的“run id”。
统计页面显示了一些有用的指标,以便深入了解您的流查询的状态。目前,它包含以下指标。
- 输入速率。 数据到达的总速率(来自所有源)。
- 处理速率。 Spark 处理数据的总速率(来自所有源)。
- 输入行数。 在一个触发中处理的记录总数(来自所有源)。
- 批处理持续时间。 每个批次的处理持续时间。
-
操作持续时间。
执行各种操作所花费的时间(以毫秒为单位)。
跟踪的操作如下所示。
- addBatch: 从源读取微批次的输入数据、处理它并将批次的输出写入接收方所花费的时间。这应该占用微批次时间的大部分。
- getBatch: 准备从源读取当前微批次输入的逻辑查询所花费的时间。
- latestOffset & getOffset: 查询此源的最大可用偏移量所花费的时间。
- queryPlanning: 生成执行计划所花费的时间。
- walCommit: 将偏移量写入元数据日志所花费的时间。
- 全局水印间隔。 批次时间戳与批次的全局水印之间的间隔。
- 总状态行数的聚合。 总状态行数的汇总。
- 已更新状态行数的聚合。 已更新状态行数的汇总。
- 使用的状态内存的聚合(以字节为单位)。 使用的状态内存的汇总(以字节为单位)。
- 因水印而丢弃的状态行数的聚合。 因水印而丢弃的状态行数的汇总。
作为早期发布版本,统计页面仍在开发中,将在未来的版本中进行改进。
流式(DStreams)标签
如果应用程序使用 Spark Streaming 和 DStream API,则网页 UI 包含一个 Streaming 选项卡。该选项卡显示数据流中每个微批次的调度延迟和处理时间,这对于故障排除流应用程序非常有用。
JDBC/ODBC 服务器选项卡
当 Spark 作为 分布式 SQL 引擎 运行时,我们可以看到这个标签。它显示了有关会话和提交的 SQL 操作的信息。
页面的第一部分显示有关JDBC/ODBC服务器的一般信息:启动时间和运行时间。
第二部分包含关于活跃和已完成会话的信息。
- 用户 和 IP 连接信息。
- 会话 ID 链接以访问会话信息。
- 开始时间 、 结束时间 和 持续时间 的会话。
- 总执行 是此会话中提交的操作数量。
第三部分包含已提交操作的SQL统计信息。
- 用户 提交操作。
- 作业ID 链接到 作业选项卡 。
- 查询的组ID 将所有作业分组在一起。应用程序可以使用此组ID取消所有正在运行的作业。
- 操作的开始时间 。
- 执行的结束时间 ,在获取结果之前。
- 获取结果后的关闭时间 。
- 执行时间 是结束时间与开始时间之间的差。
- 持续时间 是关闭时间与开始时间之间的差。
- 语句 是正在执行的操作。
-
过程状态
。
- 已启动 ,第一个状态,当过程开始时。
- 已编译 ,生成执行计划。
- 已失败 ,执行失败或以错误结束时的最终状态。
- 已取消 ,执行被取消时的最终状态。
- 已完成 处理并等待获取结果。
- 已关闭 ,客户端关闭语句时的最终状态。
- 执行计划的详细信息 包含解析的逻辑计划、分析的逻辑计划、优化的逻辑计划和物理计划或SQL语句中的错误。