Apache Spark 提供了一套 web 用户界面(UI),可以用来监控 Spark 集群的状态和资源消耗情况。本文翻译自spark UI官方文档:https://spark.apache.org/docs/latest/web-ui.html
Jobs Tab
在 Jobs 标签页中,你看到 Spark 应用程序中所有作业的摘要页面和每个作的详细信息页面。摘要页面展示了一些高层次的信息,比如所有作业的状态、持续时间、进度以及整体事件时间线。点击摘要页面中的某个作业后,你会进入该作业的详细信息页面。在详细页面中,你可以看到更具体的事件时间线、DAG(有向无环图)可视化,以及作业的所有阶段。
在这一中展示的信息包括:
-
用户:当前 Spark 用户
-
总运行时间:自 Spark 应用程序启动以来的时间
-
调度:查看作业调度信息
-
每个状态作业数量:活跃、已完成、失败
-
事件时间线:按顺序显示与执行器相关事件(如添加、移除)和作业相关事件
-
按状态分组的作业详情:显示作业的详细信息,包括作业 ID、描述(带有链接到详细作业页面)、提交时间、持续时间、阶段摘要任务进度条。
当你点击某个具体的作业时,你可以查看该作业的详细信息。
Jobs详情
这个页面展示了通过作业 ID 确定的特定作业的详细信息。
- 作业状态:运行中、已成功、已失败
- 各状态阶段数量:活跃、待处理、已完成、已跳过、已失败
- 关联的 SQL 查询:链接到该作业的 SQL 标签页
- 事件时间线:按时间顺序显示与执行器相关的事件(如添加、移除)以及作业阶段的事件。
DAG 可视化:该作业的有向无环图的可视化表示,其中顶点代表 RDD 或 DataFrame,边则表示需要在 RDD 上应用的操作。
以下是 select cs_sold_time_sk from catalog_sales order by cs_sold_time_sk
的 DAG 可视化示例。
当前使用的Agent为: EnglishToChineseAgent
阶段列表(按状态分组:活跃、待处理、已完成、已跳过、已失败):
- 阶段 ID
- 阶段描述
- 提交时间戳
- 阶段持续时间
- 任务进度条
- 输入:该阶段从存储中读取的字节数
- 输出:该阶段写入存储的字节数
- Shuffle 读取:总的 Shuffle 字节数和记录数,包括本地的数据和从远程执行器读取的数据
- Shuffle 写入:写入磁盘的字节数和记录数,以便在未来阶段的 Shuffle 操作中读取。
Stages Tab
在“阶段”标签页中,你可以看到一个汇总页面,展示了 Spark 应用中所有作业的各个阶段的当前状态。
页面开头部分是一个概览,了各个状态的阶段数量,包括活跃、待处理、已完成、已跳过和已失败的阶段。
在公平调度模式,会有一个表格展示各池的属性。
接下来是按状态分类的阶段详细信息(活跃、待处理、已完成、已跳过、已失败)。在活跃阶段中,你可以通过“终止”链接来终止该阶段。只有在失败阶段中,才会显示失败原因。你可以通过点击描述来查看任务的详细信息。
Stage详情
阶段详情页面的开头提供了一些关键信息,包括所有任务的总耗时、本地性级别概览、Shuffle读取大小/记录数以及关联的作业ID。
页面中还提供了该阶段的有向无环图(DAG)的可视化表示,其中的顶点代表 RDD 或 DataFrame,而边则代表需要应用的操作。在 DAG 可视化中,节点按操作范围进行分组,并标注了操作范围名称(如 BatchScan、WholeStageCodegen、Exchange 等)。特别是,整个阶段代码生成操作还附有代码生成 ID。对于属于 Spark DataFrame 或 SQL 执行的阶段,这种可视化允许你将阶段执行详情与 Web-UI SQL 标签页中报告的 SQL 计划图和执行计划的相关细节进行交叉。
所有任务的汇总指标以表格和时间线的形式展示。
- 任务反序列化时间:指任务的反序列化所花费的时间。
- 任务持续时间:指任务从开始到结束所用的时间。
- GC时间:是 JVM 垃圾回收的总时间。
- 结果序列化时间:是在执行器上将任务结果序列化并发送回驱动程序之前所花费的时间。
- 获取结果时间:指驱动程序从工作节点获取任务结果所用的时间。
- 调度延迟:是任务等待被调度执行所花费的时间。
- 峰值执行内存:是指在 Shuffle、聚合和连接操作期间创建的内部数据结构所使用的最大内存。
- Shuffle读取大小/记录数:总的 Shuffle 读取字节数,包括本地读取的数据和从远程执行器读取的数据。
- Shuffle读取等待时间:指任务在等待从远程机器读取 Shuffle 数据时所阻塞的时间。
- Shuffle远程读取:指从远程执行器读取的 Shuffle 数据总字节数。
- Shuffle写入时间:指任务在写入 Shuffle 数据时所花费的时间。
- Shuffle溢写(内存):是指 Shuffle 数据在内存中反序列化形式的大小。
- Shuffle溢写(磁盘):是指数据在磁盘上序列化形式的大小。
按执行器聚合的指标展示了相同的信息,但这些信息是按执行器进行汇总的。
累加器是一种共享变量,它提供了一种可变的变量,可以在种转换中进行更新。累加器可以创建为有名称或无名称,但只有有名称的累加器会被显示出来。
任务详情基本上包含了与汇总部分相同的信息,但这些信息是按任务进行详细列出的。此外,它还包括查看日志的链接,以及如果任务因任何原因失败时的任务尝试次数。如果有命名的累加器,这里可以看到每个任务结束时累加器的值。
Storage Tab
存储选项卡显示了应用程序中持久化的 RDD 和 DataFrame(如果有的话)。在汇总页面中,可以看到所有 RDD 的存储级别、大小和分区信息。而在详细信息页面中,则展示了 RDD 或 DataFrame 中所有分区的大小以及使用的执行器。
在spark sql中,如果使用了cache table
,那么会在Storage Tab显示,如下是显示的是sql:cache table cacheTable OPTIONS ('storageLevel' 'DISK_ONLY') SELECT * FROM catalog_sales;
页面上会提供一些基本信息,如存储级别、分区数量和内存开销等。
当然,你也可以使用scala实现:
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
环境变量Tab
环境选项卡展示了不同环境和变量的值,包括 JVM、 和系统属性等。
这个环境页面分为七个部分,是检查属性设置是否正确的好地方。第一部分“运行时信息”简单地包含了运行时属性,如 Java 和 Scala 的版本。第二部分“Spark 属性”列出了应用程序属性,例如“spark.app”和“spark.driver.memory”。
Resource Profile显示了executor的资源设置。
点击“Hadoop 属性”链接会显示与 Hadoop 和 YARN 相关的属性。需要注意的是,类似“spark.hadoop.*”的属性并不会在这里展示,而是在“Spark 属性”部分中显示。
“系统属性”部分提供了关于 JVM 的更多详细信息。
“Metrics属性”表示使用的监控指标接口
最后一部分“类路径条目”列出了从不同来源加载的类,这对于解决类冲突非常有用。
Executor Tab
“执行器”标签页展示了为应用程序创建的执行器的汇总信息内存和磁盘使用情况,以及任务和数据shuffle的信息。“存储内存”列显示用于缓存数据的内存使用量和保留量。
“执行器”标签页不仅提供了资源信息(每个执行器使用的内存、磁盘和核心数量),还包括性能信息(垃圾回收时间和数据shuffle信息)。
点击执行器 1 的“stderr”链接,会跳转到yarn显示详细的标准错误日志。
点击执行器 1 的“线程转储”链接,可以查看执行器 1 上 JVM 的线程转储,这对于性能分析非常帮助。
SQL Tab
“SQL”标签页将显示SQL查询的相关信息,如持续时间、作业以及物理和逻辑计划。这里我们通过一个基础示例来展示这一标签页的功能:
点进去sql任务可以看到DAG,
查询详情页面展示了有关查询执行时间、持续时间、相关作业列表以及查询执行DAG的信息。第一个模块‘WholeStageCodegen (1)’将多个操作符(如‘HashAggregate’)编译成一个Java函数,以提升性能。在该模块中会列出如行数和溢出大小等指标。模块名称中的注释‘(1)’表示代码生成的编号。第二个模块‘Exchange’展示了有关数据交换的指标,包括写入的生成的数据记录数、总数据大小等。第三个模块’AQEShuffleRead’说明了在AQE优化过程中,Spark使用了2个分区进行Shuffle操作,并对这些分区进行了优化合并,使得每个分区的数据大小更加均匀,从而提高了执行效率。
点击页面下的Details可以看到任务的物理执行计划:
SQL指标
SQL操作符的指标显示在物理操作符的模块中。当我们想深入了解每个操作符的执行细节时,SQL指标会非常有用。例如,“输出行数”可以告诉我们在一个Filter操作符之后输出了多少行,而在一个Exchange操作符中的“写入的总shuffle字节数”则展示了shuffle过程中写入的字节数。
下面是SQL指标列表:
SQL metrics | 含义 | 操作符 |
---|---|---|
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、EvalPython、FlatMapInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
data returned from Python workers |
从Python工作者接收回来的序列化数据字节数 | ArrowEvalPython、AggregateInPandas、BatchEvalPython、FlatMapGroupsInPandas、FlatMapsCoGroupsInPandas、FlatMapsCoGroupsInPandasWithState、MapInPandas、PythonMapInArrow、WindowsInPandas |
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://lrting.top/backend/14423/