Spark 调优的干货总结,经验丰富的同事写的,内容比较全面,适合有一定基础的你参考参考。
Join 优化是个老话题了,用得多出问题也多。文档里提到的广播 Join挺实用的,尤其是大表小表配对时,直接把小表广播到各个节点,省下了不少网络 IO。这招在 MapReduce 和 Hive 里也用过,效果还挺。
数据倾斜的问题也有不少细节。比如空值集中,建议加点随机值打散下分布;再比如count(distinct)
太重,可以先 Group By;还有倾斜 Key,单独拎出来,再合回去。这几招组合拳下来,性能能提一截。
小文件太多会把任务分得碎,启动开销大得离谱。可以用coalesce
来减少分区数,别乱repartition
,那玩意容易 Shufffle 过头。数据源头如果就是小文件堆,可以用CombineTextInputFormat
先合合。
并行度配置这块也挺关键,推荐用 CPU 核心数的 2-3 倍来设,一般比较稳。executor-memory
、num-executors
啥的也得根据实际场景调一调,不能盲跟着默认。
有些中间数据要复用的话,别忘了cache
或persist
一下,少点重复计算,整体速度上来得快一些。
分粒度输出需求多的话,用flatMap
数据,再搭配multiinsert
写到多个目录,还是蛮方便的。
JVM 内存优化方面,别用太重的对象,数组和基础类型能省一大截。KryoSerializer
用起来也比 Java 默认强,快、省。还有 GC 监控一定得开着,-verbose:gc
这些参数都加上,方便定位问题。
参数调优里,像spark.shuffle.memoryFraction
和spark.storage.memoryFraction
按场景调,Shuffle 多的就加前者,Cache 多的就加后者。spark.akka.frameSize
默认 10MB,大任务建议往上调一点。还有spark.rdd.compress
默认是关的,内存紧张可以打开省点空间。
想看源码、扩展阅读可以看看这些文章,挺有的:
如果你最近在调 Spark 作业、觉得卡顿,可以先从这些点下手优化看看。