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

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

你好,我是吴磊。
好久不见了,距离专栏结束有不少时间了,不过这期间我一直在关注着同学们的留言。今天我就带着你的期待又来了。
在性能调优的本质那一讲(第 2 讲),我们说过性能调优方法论。
其中的第一条,就是根据专家经验或是运行时的诊断,来定位性能瓶颈。作为 Spark 内置的运行时监控界面,Spark UI 是我们必须要掌握的重要工具。而且随着课程的推进,有不少同学在后台反馈,希望我补充 Spark UI 的课程内容。
鉴于以上两点,我用加餐的形式,把 Spark UI 的内容补充到课程中,希望对你有所帮助。
在日常的开发工作中,我们总会遇到 Spark 应用运行失败、或是执行效率未达预期的情况。对于这样的问题,想找到根本原因(Root Cause),就可以通过 Spark UI 来获取最直接、最直观的线索,在全面地审查 Spark 应用的同时,迅速定位问题所在。
如果我们把失败的、或是执行低效的 Spark 应用看作是“病人”的话,那么 Spark UI 中关于应用的众多度量指标(Metrics),就是这个病人的“体检报告”。结合多样的 Metrics,身为“大夫”的开发者即可结合经验来迅速地定位“病灶”。
今天这一讲,让我们以小汽车摇号中“倍率计算”的应用(详细内容你可以回顾第 30 讲)为例,用图解的方式,一步步地去认识 Spark UI,看一看它有哪些关键的度量指标,这些指标都是什么含义,又能为开发者提供哪些洞察(Insights)?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解读了Spark作业的“体检报告”,通过介绍Spark UI的使用方法和重要功能,帮助读者了解如何利用Spark UI来定位性能瓶颈和优化Spark应用。文章以图解的方式详细介绍了Spark UI的一级入口,包括Executors、Environment、Storage、SQL、Jobs和Stages,并重点解释了Executors和Environment页面的内容。在Executors页面中,记录了每个Executor的工作负载情况,帮助开发者判断应用中是否存在负载不均衡或数据倾斜的问题;而Environment页面则记录了各种环境变量和配置项信息,特别关注了Spark Properties,帮助开发者确认运行时的设置是否一致。通过本文的介绍,读者可以快速了解Spark UI的重要功能和使用方法,为性能调优和应用优化提供了有力的工具和指导。文章还介绍了Storage、SQL、Jobs和Stages等页面的内容,帮助读者全面了解Spark UI的各个方面,为深入学习和实际应用提供了指导和参考。整体而言,本文以清晰的图示和详细的解读,为读者提供了系统全面的Spark UI使用指南,对于需要优化Spark应用性能的开发者具有重要的参考价值。

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

全部留言(14)

  • 最新
  • 精选
  • Hiway
    第一问:我的理解是RDD Blocks表示的是读入数据集时的分区数,而Complete Tasks则表示整个job完成时该Executor完成的Task数。我觉得原因有二: 一是spark在划分DAG时,遇到shuffle便会断开产生新的Stage,一个task只是对应一个stage里的一个partition。 二是如果未修改spark.sql.shuffle.partitions配置,在join的时候就会自动修改为200的并行度,对应的下一个Stage也就产生了200个task 第二问:从Executors界面看,应该是两个Executor在跑。因为是分布式所以在最后write的时候,两个Executor都进行了save操作。至于为什么是两台Executor跑,应该这样计算出来的:executor 数量 = spark.cores.max/spark.executor.cores 老师,是这样吗?可以发一下你的spark-submit命令嘛?

    作者回复: 不太对哈~ 标准答案是: 第一个:每个rdd经过处理后,又可能生成其他rdd,这里的tasks显示的是整个executors处理过的任务数,跟rdd cache的blocks无关。 第二个:因为代码最后一个是save,而save的mode是overwrite,save本身会有一个action,而overwrite的过程,实际上是先在临时文件夹生成数据,然后再move到目标文件夹,有一个数据移动的动作,所以Spark也把它算做了一个Action。

    2021-10-26
    2
    16
  • onepieceJT2018
    不知道为什么 hive on spark的话 ui里面storage 这个面板是空白

    作者回复: Storage页面是用来显示分布式数据集缓存的,比如RDD Cache、DataFrame Cache,等等。 Hive on Spark的集成中,Spark与MapReduce、Tez都是同等的地位,都是执行引擎,而且一般Hive SQL中,并不存在分布式数据集缓存的概念,所以Storage面板空空如也倒是也不足为怪~

    2021-10-24
    6
  • Reiser
    周末回看之前的文章,看到这篇加餐有点感动。太走心了,磊哥!

    作者回复: 哈哈,老弟喜欢就好~

    2021-10-31
    5
  • LR.яг ®
    有一个别的组同事,每次启动spark都会把资源申请完,他的部分启动命令如下: --executor-memory 6G --num-executors 2000 --executor-cores 4。导致我每次都要去kill掉他的application。 请问老师,有没有什么方法可以限制启动时不允许申请这么多资源?

    作者回复: 有的,不过这个限制,不是在Spark层面做的。一般在工业级,Spark一般都是用YARN来调度,YARN里面可以设置资源队列,每个队列内部,可以限制可用资源总量,不同类型的作业,比如批处理、流计算,往往是会单独创建队列来服务。所以回答你的问题,可以让运营团队设置不同的资源队列,从而达到资源隔离的目的~

    2022-01-21
    2
    2
  • Unknown element
    老师我的executors页面为什么rdd blocks都是0?

    作者回复: 听上去不太对,你可以加我微信,把代码和截图发给我,咱们一起看看。微信搜索“方块K”或是“rJunior”

    2021-11-23
    4
    1
  • 保护
    Job Id 为 7存在的原因 是因为保存了文件嘛

    作者回复: 是的~

    2021-11-22
    1
  • Geek_18fe90
    解决了我的一块心病

    作者回复: 哈哈

    2021-11-15
    1
  • jerry guo
    spark sql job的Storage页面怎么是空白的呢?是只有运行的时候才有数据吗

    作者回复: 运行的时候Spark UI看8080端口;运行结束之后,在开启History server的情况下,看18080端口~

    2021-10-31
    1
  • Geek_01fccd
    多个job公用一个executer,是按照executer纬度,计算的完成的task数吗?

    作者回复: 是的,不同页面的统计维度不同,拿Executors页面为例,它的统计维度是Executors,相当于把其他维度(比如Jobs、Stages)就都抹掉了

    2021-10-20
    2
    1
  • Sean
    抢个沙发先🤯🤯🤯

    作者回复: 哈哈,绝对沙发~🛋️

    2021-10-19
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部