《spark常见调优》
Posted wall-eve
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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操作。
以上是关于《spark常见调优》的主要内容,如果未能解决你的问题,请参考以下文章