Spark性能优化总结(建议收藏)

本文分享了一次针对Spark流量统计程序的性能优化经验,优化目标包括确保大数据量任务的成功运行、降低资源消耗和提高计算性能。基础优化涉及Stage、Cache和Partition的调整,如减少shuffle操作、合理使用cache和调整partition数。资源优化通过设置合适的executor数量、内存参数避免被YARN Kill。内存/GC优化中,重点关注Direct Memory和GC策略调整,以防止内存溢出。经过一系列优化,程序能在160 vcores + 480G memory下2.5小时内完成一天的日志处理。
摘要由CSDN通过智能技术生成

近期优化了一个spark流量统计的程序,此程序跑5分钟小数据量日志不到5分钟,但相同的程序跑一天大数据量日志各种失败。经优化,使用160 vcores + 480G memory,一天的日志可在2.5小时内跑完,下面对一些优化的思路方法进行梳理。

优化的目标

  1. 保证大数据量下任务运行成功

  2. 降低资源消耗

  3. 提高计算性能

三个目标优先级依次递减,首要解决的是程序能够跑通大数据量,资源性能尽量进行优化。

基础优化

这部分主要对程序进行优化,主要考虑stage、cache、partition等方面。

我的官方群点击进入

提升到30K进阶资料,免费获取:

【社群福利】30G-PHP进阶资料,助力大家都能30K

Stage

在进行shuffle操作时,如reduceByKey、groupByKey,会划分新的stage。同一个stage内部使用pipe line进行执行,效率较高;stage之间进行shuffle,效率较低。故大数据量下,应进行代码结构优化,尽量减少shuffle操作。

Cache

本例中,首先计算出一个baseRDD,然后对其进行cache,后续启动三个子任务基于cache进行后续计算。

对于5分钟小数据量,采用StorageLevel.MEMORY_ONLY,而对于大数据下我们直接采用了StorageLevel.DISK_ONLY。DISK_ONLY_2相较DISK_ONLY具有2备份,cache的稳定性更高,但同时开销更大,cache除了在executor本地进行存储外,还需走网络传输至其他节点。后续我们的优化,会保证executor的稳定性,故没有必要采用DISK_ONLY_2。实时上,如果优化的不好,我们发现executor也会大面积挂掉,这时候即便DISK_ONLY_2,也是然并卵,所以保证executor的稳定性才是保证cache稳定性的关键。

cache是lazy执行的,这点很容易犯错,例如:

val raw = sc.textFile(file)
 val baseRDD = raw.map(...).filter(...) 
baseRDD.cache() 
val threadList = new Array( 
  new Thread(new SubTaskThead1(baseRDD)), 
  new Thread(new SubTaskThead2(baseRDD)), 
  new Thread(new SubTaskThead3(baseRDD)) 
) 
threadList.map(_.start()) 
threadList.map(_.join())

这个例子在三个子线程开始并行执行的时候,baseRDD由于lazy执行,还没被cache,这时候三个线程会同时进行baseRDD的计算,cache的功能形同虚设。可以在baseRDD.cache()后增加baseRDD.count(),显式的触发cache,当然count()是一个action,本身会触发一个job。

再举一个错误的例子:

val raw = sc.textFile(file) 
val pvLog = raw.filter(isPV(_)) 
val clLog = raw.filter(isCL(_))
val baseRDD = pvLog.union(clLog) 
val baseRDD.count()

由于textFile()也是lazy执行的,故本例会进行两次相同的hdfs文件的读取,效率较差。解决办法,是对pvLog和clLog共同的父RDD进行cache。

Partition

一个stage由

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值