作者:klolo先生 | 来源:互联网 | 2023-09-18 15:05
长按二维码关注大数据领域必关注的公众号写过Spark程序的人,一定都面临过Spark程序优化的问题。如果你是老鸟,优化了很多程序的话,那么就得心应手,没有什么难
写过Spark程序的人,一定都面临过Spark程序优化的问题。如果你是老鸟,优化了很多程序的话,那么就得心应手,没有什么难度。但对于一个新手来说,要优化一个Spark程序很困难。因为这不仅涉及到Spark方面的知识,还涉及到Hadoop等各方面的知识。
而在Spark程序优化的过程中,我们需要反复调整几个executor数量,executor memory大小等几个参数,还需要观察Task有没有倾斜的问题。一旦倾斜,就会出现木桶效应。
除此之外,对于新手编写的Spark程序来说,很容易滥用Driver内存,在Driver上做过多操作。
这些都会导致我们的程序运行速度远远达不到预期。
幸运的是,我们有一些工具能够对Spark程序进行分析,让我们更方便的对Spark程序进行优化,比如Sparklens/Sparklint/Dr.Elephant/SparkOscope等。
本文中,我们会介绍如何通过Sparklens对程序进行分析,并进一步优化。
Sparklens介绍
Sparklens是Qubole提供的一款工具。它能识别出Spark程序的瓶颈,并且警告我们那些有严重性能问题的地方。
这款工具的主要功能是让我们识别我们给任务分配的资源是否合理。有时我们分配了过多资源,期望程序能运行的更快,比如分配了过多的executor memory,但这样导致了executor的数量减少了,进一步降低了我们的程序性能。
Sparklens就能帮我们识别出来类似这种问题,减少开发人员调优的难度。
如何使用 Sparklens
Sparklens用起来很简单,不需要安装任何东西。只需要在执行spark-submit的时候加一些参数就可以了:
--packages qubole:Sparklens:0.3.1-s_2.11 --conf spark.extraListeners=com.qubole.Sparklens.QuboleJobListener
然后执行命令即可。
Sparklens输出
Driver和Executor各自占用的时间
这是Spark程序在Driver和Executor上的时间占比,很容易理解。
正常来说,Driver占用的时间应该特别少。但有时由于程序写的不好,就会出现Driver占用太多时间,甚至出现内存溢出的问题。
常见的几个原因如下:
• spark.sql.autoBroadcastJoinThreshold配置错误预估理想情况下应用程序需要的时间
在task的数量刚好等于cores的数量,并且没有数据倾斜时,估算一个运行时间,作为理想情况下应用程序需要的时间关键路径时间
即程序运行需要的最小时间。如果这个时间过长,说明我们程序的并行度不够,或者有很严重的数据倾斜问题。很容易理解,不做更多解释。可以作为我们设置并行度时候的依据。
计算时间
告诉我们多少资源被浪费掉了。
数据倾斜
告诉我们每个stage是否有倾斜。
上面所有的输出也可以在Sparklens UI中看到:总结
通过Sparklens我们能看到程序中是否存在数据倾斜,并行度设置不合理的地方。但要对一个Spark程序进行调优,这些数据只是第一步,有了这些数据,我们还要结合其它的一些知识去进行优化。比如如果程序没有倾斜问题,但就是和预期的结果有一定的差距,并行度也没有问题,那我们如何去进行调优?这时候就需要我们对底层存储,甚至是JVM等的知识有一定的储备才能去定位的。
大数据凉凉了?Apache将一众大数据开源项目束之高阁!
Apache Flink 在快手的过去、现在和未来
大数据基础运维:HDFS参数调优
大数据无处不在,向左还是向右
【HBase调优】Hbase万亿级存储性能优化总结
【Python精华】100个Python练手小程序
【HBase企业应用开发】工作中自己总结的Hbase笔记,非常全面!【剑指Offer】近50个常见算法面试题的Java实现代码
长按识别左侧二维码
关注领福利
领10本经典大数据书