0


如何通过SparkUI 查看SparkSql作业

一、spark ui 中的入口

左上角的 2.4.0 表当前执行任务的spark版本为 spark 2.4.0

序号

入口页

包含

1

Jobs

Jobs详情页

2

Stages

Stage详情页

3

Storege

Cache缓存详情页

4

Environment

配置项、环境变量详情(如设置的参数)

5

Executors

每个excutors执行情况、计算详情

6

SQL

任务的执行计划详情

二、各入口详情

2.1 Jobs

In Apache Spark execution terminology, operations that physically move data in order to produce some result are called “jobs”.

spark任务中,每遇到一个action算子会提交一个job。job之间一般是有依赖的,为串行执行的,从job0开始执行,执行完1个job才会执行下一个job。如图

  • Total Uptime:总的运行时间,从master开始运行到结束的整体时间。
  • Scheduling Mode:application中task任务的调度策略,由参数spark.scheduler.mode来设置,可选的参数有FAIR和FIFO,默认是FIFO。
  • Completed Jobs:已完成的Job。
  • Active Jobs:正在运行的Job。
  • Event Timeline:在application应用运行期间,Job和Exector的增加和删除事件进行图形化的展现。这个就是用来表示调度job何时启动何时结束,以及Excutor何时加入何时移除。

图中,每个job Description中的蓝色链接,点击后都可进入Job的详细信息页面

2.2 Stages

Jobs are decomposed into “stages” by separating where a shuffle is required.

job中stage的划分就是根据shuffle依赖进行的。shuffle依赖是两个stage的分界点。

Stages中的一些关键词:

broadcast exchange:表示这个stage是广播阶段

CompactFilesCommitProtocol:表示合并小文件

图中,点击每个stage Description中的蓝色链接后都可进入stage的详细信息页面

  • Total time across all tasks:当前stage中所有task花费的时间和。
  • Locality Level Summary:不同本地化级别下的任务数。
  • Input Size/Records:输入的数据字节数大小/记录条数。
  • Shuffle Write:为下一个依赖的stage提供输入数据,shuffle过程中通过网络传输的数据字节数/记录条数。应该尽量减少shuffle的数据量及其操作次数,这是spark任务优化的一条基本原则。
  • DAG Visualization:当前stage的操作流程图。但这个部分不会显示读的哪张表,关联字段是什么,我们可以通过完整的sql执行计划图查看详细信息。(详见2.6.2)
  • Show Additional Metrics:当前stage中所有task的一些指标(每一指标项鼠标移动上去后会有对应解释信息)统计信息。
  • Event Timeline:清楚地展示在每个Executor上各个task的各个阶段的时间统计信息,可以清楚地看到task任务时间是否有明显倾斜,以及倾斜的时间主要是属于哪个阶段,从而有针对性的进行优化。
  • Aggregated Metrics by Executor:将task运行的指标信息按excutor做聚合后的统计信息,并可查看某个Excutor上任务运行的日志信息。
  • Tasks:当前stage中所有任务运行的明细信息,是与Event Timeline中的信息对应的文字展示(可以点击某个task的stderr/stdout查看具体的任务executor日志)。

2.3 Storage

Storage页面能看出application当前使用的缓存情况,可以看到有哪些RDD被缓存了,以及占用的内存资源。如果job在执行时持久化(persist)/缓存(cache)了一个RDD,那么RDD的信息可以在这个选项卡中查看。

注:一般任务中有缓存,且是还在执行的过程中,这个页面才有对应的信息,任务执行时缓存结束了,这个页面的信息就会释放,就看不到什么内容了。

  • Cached Partitions:已缓存的分区数
  • Fraction Cached:缓存进度
  • Size in Memory:缓存在内存中的大小
  • Size on Disk:缓存在磁盘中的大小

2.4 Enviroment

该页面记录了环境变量与配置项信息,如我们经常给任务添加的参数是否生效,以及任务的参数设置可以在该页面查看,包括java版本,scala版本信息,引用的jar包等等

2.5 Executor

Executors Tab 的主要内容如下,主要包含“Summary”和“Executors”两部分。这两部分所记录的度量指标是一致的,其中“Executors”以更细的粒度记录着每一个 Executor 的详情,而第一部分“Summary”是下面所有 Executors 度量指标的简单加和。

Summary:是所有Executors度量指标的累加。

Executors:每一个Executor的详情。其中第一行为driver,对应的logs为driver日志;Execuotor ID对应每个stage中的executor id(如图2.5.2)

(图2.5.1)

(图2.5.2)

executor日志无法查看的情况:复制这个executor的host,在driver stderr日志中,查看前1M的日志,搜索这个host,就能找到对应的container_id, 随便打开一个可以打开的executor日志,替换网址中的executor host和container_id,有多个container_id的则需要一个一个实验

executor日志怎么看?

以上截图例子中这个stage生成了9个task,则task(TID)的索引是从0开始计数的,即task是0-8,共9个task

每个task(TID)中下会打印读了哪些RDD,每个RDD后面会有这个rdd的,如range: 268435456-298702760(从range可判断文件是否分片)

关键字:FileScanRDD

2.6 SQL

2.6.1 SQL页面介绍

当我们的应用包含 DataFrame、Dataset 或是 SQL 的时候,Spark UI 的 SQL 页面,就会展示相应的内容,如下图所示。

Job IDs 中的数字表示哪些job串行完成了这段sql,点击那行的Description中的蓝色超链接可进入二级页面查看这一段sql的完整执行计划。

有些appid中可能执行几段sql,如上图,执行了两段SQL,故在SQL页面Job IDs中会有两段完整的job id记录。选择我们要查看的那段sql的链接。以下为点击超链接后的页面。

在这个页面最后还有 Details,展开Details 可以看到这段SQL的执行计划

注意:像创建函数,建表、删表是没有完整计划可以看的

2.6.2 执行计划-DAG Visualization

spark中对SQL的解析,是将SQL字符串切分成一个一个的Token,再根据一定语义规则解析成一颗语法树。如下图:

那么在执行计划中我们可以看到:

执行计划中的每个蓝色方块都有非常多的信息可以查看,如肉眼直接可以看到的Scan orc table_name ,number of output rows: 说明扫描了哪个表,这个表有多少行,我们把鼠标放在对应的信息上也会显示详细的信息,扫描的表的hdfs路径,分区,表存在的字段,等等,如下图

从上面的几个图片示例中,我们大概了解了一个sql的执行计划是怎么样的,我们能获取到什么信息,下面列举一些关键词:

  • Scan :扫描表,并显示表名
  • Filter:过滤条件,一般是扫描这张表那部分的where条件
  • Project:为select的字段
  • Sort:排序
  • shuffle hash join、broadcast hash join、sort merge join:join的常见算法
  • Window:一般是存在窗口函数
  • Exchange:Exchange一般为group by ,join on 或者partition 的操作,这个过程会有shuffle。spark2.4.0中这里的id(coordinator id: xxxxxxxxxx)和stage中的dag计划图中的exchange阶段的id对应,spark3.1.2中是WholeStageCodegen(id)。举例:这个sql,stage23为shuffle阶段,dag图中没有的exchangeid=38650596,则在sql中,完整的执行计划中能搜索到对应的exchangeid=38650596的部分,就可以找到是什么表之间关联,关联字段是哪个。如下图

spark3.1.2的stage中则是根据WholeStageCodegen(id)这个信息去找

2.6.3 执行计划-Details

2.7 Streaming(待完善)

streaming页面中的参数

Porcessing Time:用来统计每个batch内处理数据所消费的时间

Scheduling Delay:用来统计在等待被处理所消费的时间

三、Executors中的Thread dump

正在运行的任务,想看任务现在在做什么,可以通过查看executor中的Thread dump;如果是任务卡在某一个stage,需要先在stage中找到这个stage目前运行的Executor ID,再在Executors页面中找到对应的executor 的Thread dump,这样就能去查看这个executor目前在做什么。(这个部分是需要查看executor的堆栈,根据栈信息(也可能需要查看源码)去做分析)


本文转载自: https://blog.csdn.net/weixin_50216185/article/details/126830742
版权归原作者 一颗苹果肌 所有, 如有侵权,请联系我们删除。

“如何通过SparkUI 查看SparkSql作业”的评论:

还没有评论