《spark常见调优》

一:开发调优

原则1:对多次使用的RDD进行持久化,共享同一个RDD

原则2:经过filter算子过后使用coalesce优化分区数量。分区少并且数据量大是通过repartition重分区增大并发。

原则3:读取hbase或插入数据库时使用foreachPartition代替foreach并且使用批量读取和插入,可大幅提升读写性能。

原则4:尽量避免shuffle算子,大表关联小表可使用Broadcast+map的方式,实际应用中,习惯把维表初始化到hashmap中分区中进行操作。

二:资源调优

Excutor的内存主要分为三块:

第一块是让task执行我们自己编写的代码使用,默认是占Excutor总内存的20%

第二块是让task通过shuffle过程拉取了上一个stage的task的输出后,进行聚合等操作时使用,默认也是20%

第三块是让RDD持久化时使用,默认占Excutor总内存的60%

1:合理设置

num-excutors,实际应用中可跟kafka的分区数保持一致。

2:合理设置excutor-memory,它的20%要大于每个分区的占用时间,否则会内存溢出

3:合理设置spark-streaming任务的批次间隔运行时间。根据业务的需求和压力测试的qps性能指标综合考虑。

三:数据倾斜调优

1:数据倾斜的现象:绝大多数task执行得都非常快,但个别task执行极慢,并且可能出现内存溢出的情况。

      数据倾斜的原因:任务在进行shuffle的时候,某个key的对应的数据量非常大,就会发生数据倾斜。

2:如何定位数据倾斜的代码:数据倾斜只会发生在shuffle过程中。可以通过SparkWeb UI来查看当前运行到了第几个stage。进入当前stage界面就可以看到每个task的运行情况(包括运行的数据量和占用空间)

     查看导致数据倾斜Key的分布情况:可以先使用sample抽样的方式,减少运算量,然后使用countByKey算子统计出每个key出现的次数,降序即可查看哪些Key出现了数据倾斜。

3:数据倾斜的解决方案:

   1)过滤少量导致倾斜的key(key为空值的情况,不影响结果的情况下)

   2)提高shuffle操作的并行度,增大内存(只能缓解)

   3)大表和小表关联可使用map join的方式。

   4)采样倾斜key并拆分join操作。

猜你喜欢

转载自www.cnblogs.com/wall-eve/p/10161720.html