Spark 性能调优实战
吴磊
前 FreeWheel 机器学习团队负责人
8808 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Spark 性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

Spark UI(下):深入解读Spark作业的“体检报告”

你好,我是吴磊。
在上一讲,我们一起梳理了 Spark UI 的一级入口。其中 Executors、Environment、Storage 是详情页,开发者可以通过这 3 个页面,迅速地了解集群整体的计算负载、运行环境,以及数据集缓存的详细情况。而 SQL、Jobs、Stages,更多地是一种罗列式的展示,想要了解其中的细节,还需要进入到二级入口。
沿用之前的比喻,身为“大夫”的开发者想要结合经验,迅速定位“病灶”,离不开各式各样的指标项。而今天要讲的二级入口,相比一级入口,内容会更加丰富、详尽。要想成为一名“临床经验丰富”的老医生,咱们先要做到熟练解读这些度量指标。
Spark UI导航条:一级入口
所谓二级入口,它指的是,通过一次超链接跳转才能访问到的页面。对于 SQL、Jobs 和 Stages 这 3 类入口来说,二级入口往往已经提供了足够的信息,基本覆盖了“体检报告”的全部内容。因此,尽管 Spark UI 也提供了少量的三级入口(需要两跳才能到达的页面),但是这些隐藏在“犄角旮旯”的三级入口,往往并不需要开发者去特别关注。
接下来,我们就沿着 SQL -> Jobs -> Stages 的顺序,依次地去访问它们的二级入口,从而针对全局 DAG、作业以及执行阶段,获得更加深入的探索与洞察。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解读了Spark作业的“体检报告”第二期,通过分析Spark UI的二级入口,详细介绍了SQL、Jobs和Stages的执行计划和度量指标。在SQL详情页中,重点讨论了Exchange、Sort和Aggregate的度量指标,以及如何根据这些指标进行调优分析。对于Exchange,文章提供了丰富的Metrics来刻画Shuffle的计算过程,为调优提供了洞察与思路;对于Sort和Aggregate,文章分别介绍了内存消耗的度量指标,并指导读者如何根据这些指标进行参数设置以提升执行性能。在Jobs详情页中,文章简洁直观地罗列了隶属于当前Job的所有Stages,并指出了需要通过“Description”超链接跳转以获取每个Stage的执行细节。整体而言,本文通过深入的技术分析,为读者提供了对Spark作业执行过程的全面了解和调优指导。 文章还介绍了Stage详情页的信息量较大,包含Stage DAG、Event Timeline与Task Metrics。通过分析Event Timeline,读者可以了解分布式任务调度与执行的时间花销,从而判断作业是否存在调度开销过大或Shuffle负载过重的问题。而Task Metrics提供了详尽的量化指标,包括统计分布信息,帮助读者判定作业的任务负载是否存在倾斜,并提供了消除不均衡的调优方法。此外,文章还提到了如何通过Spill指标计算数据的内存消耗,以及如何利用本地性级别来调度任务,保证数据不动、代码动的原则。 总的来说,本文通过对Spark UI各个入口的详细解读,为读者提供了全面的性能调优思路和方法。同时,文章还提醒读者在使用Spark UI时需要注意端口的变化,以及分享了关于定位数据倾斜问题的思考题,为读者提供了更多的思考和交流空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spark 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • Geek_d50b3e
    置顶
    我有个问题。我是2个大表关联shullfe 的时候看到很多executor都是空就executor 有数,倾斜了是怎么回事?
    2022-03-18
  • 王欢
    spark shuffle read中max和median的比值大小,可以衡量数据倾斜程度

    作者回复: 没错~ 正解,满分💯

    2021-10-21
    5
  • 敬彦辉
    Spill(Memory)和 Spill(Disk)这两个指标还是不太清楚,之前遇到过一个任务,最大执行时间的task,它的Spill(Memory)有3g,Spill(Disk)只有200m,这些数据是内存存了3g,内存存不下又溢出到磁盘吗?这种场景该怎么优化,老师帮忙给解答下

    作者回复: 关于Spill,其实就是咱们在Shuffle那讲,介绍的生成Shuffle中间文件的过程。在Map阶段,Spark先往内存数据结构里面写,写不下了,就Spill到磁盘的临时文件。 Spill数据在内存中的总尺寸,就是Spill(Memory),在磁盘中的总大小,就是Spill(Disk)。其实不管内存设置多大,Spill都是难免的,这倒没什么可怕的。 所以说内存不够大,不是问题,问题是CPU、内存、数据三者是不是平衡,这一点很重要,这一部分可以参考“三足鼎立”的调优方法去平衡。再有一个思路,就是把Shuffle干掉,自然就没有Spill了,干掉Shuffle的方法,可以参考Broadcast Join。再有,即便干不掉Shuffle,还可以用“能省则省、能拖则拖”的办法,减少需要Shuffle的数据量~ 办法其实有很多,都写在咱们专栏的不同课程里啦~

    2021-10-22
    2
    4
  • onee
    老师,有几个疑问。Peak memory是单个executor堆内存的使用峰值还是单executor内execution memory的使用峰值?其次,Peak memory Total是stage所有task的峰值之和吗?

    作者回复: 是的~ Execution memory使用峰值,不包括Storage memory。另外,Peak memory Total是某一时刻,整个集群在运行时的内存消耗峰值,不是所有task的内存用量,也不是你说的“所有task的峰值之和”。 你可以这么理解,你把一个Job的运行时间,看作是横坐标,纵坐标,是每个时刻这个Job对于集群内存的消耗。每个时刻所运行的tasks数量,自然不是整个Job的所有tasks,而是其一部分,一个“侧切面”。这条曲线的峰值,就是这里的Peak memory Total~

    2021-10-20
    2
    4
  • Sean
    磊哥,有个疑问想要请教下,您说的到的 "Peak memroy,某个Job在某个时刻对于集群内存的消耗,比然这个时刻不会包含所有task,而是这个时刻正在runing的task" 对于这一点我个人理解为针对这个时刻因该是numActiveTasks最大时所消耗的内存,也即配置参数所示最大为6个axtivetask时的消耗peak memory是最大的(这个磊哥截图ui 上的配置executor=2,cores=3,和磊哥最开始表格里给出的executor=3g不一致) 如果这里理解没错的话,那么根据案例中peak memory=18.8GB来说,可调整executor.memroy=10G(18.8/6≈3.13G,3.13 * 3 = 9.39G,当然这里我省略了Storage,User,Reserved的消耗) 我个人理解就是这样的,不知道是否正确,求磊哥解惑,感谢~

    作者回复: 赞👍,是的,就是这个意思~

    2021-10-31
    2
    3
  • Sean
    问下磊哥,发现有的任务Peak Execution Memory为0这种情况会是什么原因导致呢?任务执行倒是正常

    作者回复: 这个就蹊跷了,有任务的上下文吗?发出来一起看看~ 你说的Peak Execution Memory为0,是整个集群,还是by task的各种quantile值?

    2021-10-25
    2
  • onee
    老师,sparksql执行计划页中的peak memory total(min,mid,max),指的是peak execution memory吗?

    作者回复: 对,Execution memory

    2021-10-20
  • 狗哭
    老师太给力了

    作者回复: 欠的债迟早是要还的,哈哈

    2021-10-20
  • Geek_6048ff
    Event Timeline中空白比较多是代表啥意思呀
    2022-06-15
    2
  • 〆、维生素ゝ
    您好,请教一个问题,stage上的task数量可以精确计算出来吗?我的task read是空 会是啥原因呀
    2022-06-14
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部