spark - 性能优化小keys

1.Spark现在主推的是dataset的api,越来越多的算子可以基于dataset去做,dataset基于天然自带的优化引擎,但是dataset操控能力不如RDD,如果你是大神你应该用的是RDD。

2.reduceByKey和groupbykey:reduceByKey会在map端先进行reduce聚合操作,而groupbykey不会提前进行聚合操作,把所有的数据全部传到reduce端,shuffle数据条数更多。

3.coalesce:使用coalesce重新设置分区数,当使用了filter算子之后,数据分区内的数据量会存在较大差异,存在数据碎片现象,使用coalesce(numpartition,shuffle = true)重新设置新的分区数目,一般设置一个更小的分区属。 

   由大到小:shuffle = false, 但是如果是100->1 这种,需要shuffle = true,将这个stage断开,因为不断开的化,这个stage都

                  会是并行度为1,并行度太低了

   由小到大:shuffle = true

4.spark内存参数设置;

  spark.shuffle.memoryFraction:默认占用20%,如果计算依赖shuffle可以调高

  spark.storage.memoryFraction: 默认占用60%,缓存实例数据,如果计算比较依赖缓存数据,可以将比例调高

5.并行度设置:

   spark.default.parallelism:建议至少设置100,最好是700左右,executor-cores 决定了executor中的task并行数量,默认并行度太小的情况下,无法充分发挥executor并行能力。

  官方推荐:task数量设置成Spark Application总cpu数目的2-3倍,意思是一共可以使用150 CPU cores,基本要设置task数量为300-500。

  此外,如果机器内存资源充足,cpu资源紧张,可以将并行度设置偏小,如果cpu 资源充足,而内存资源紧张,可以设置较高的并行度,因为,内存资源在一个executor上是共享的,较大的任务,是使用更少的cpu和更多的内存资源。

6. 目前parquet是自带压缩的,rdd和broadcase自带压缩,但是在cpu密集类的计算不适合压缩,因为压缩还需要cpu资源的,spark自带的压缩方法有:lzf和snappy两种

7.OOM解决:
   1.设置Java参数,增大堆空间   2.增大并行度,减少每个任务的输入数据,减少内存占用  3.java profile工具查看问题所在。



待续……


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值