Spark 调优的干货总结,经验丰富的同事写的,内容比较全面,适合有一定基础的你参考参考。

Join 优化是个老话题了,用得多出问题也多。文档里提到的广播 Join挺实用的,尤其是大表小表配对时,直接把小表广播到各个节点,省下了不少网络 IO。这招在 MapReduce 和 Hive 里也用过,效果还挺。

数据倾斜的问题也有不少细节。比如空值集中,建议加点随机值打散下分布;再比如count(distinct)太重,可以先 Group By;还有倾斜 Key,单独拎出来,再合回去。这几招组合拳下来,性能能提一截。

小文件太多会把任务分得碎,启动开销大得离谱。可以用coalesce来减少分区数,别乱repartition,那玩意容易 Shufffle 过头。数据源头如果就是小文件堆,可以用CombineTextInputFormat先合合。

并行度配置这块也挺关键,推荐用 CPU 核心数的 2-3 倍来设,一般比较稳。executor-memorynum-executors啥的也得根据实际场景调一调,不能盲跟着默认。

有些中间数据要复用的话,别忘了cachepersist一下,少点重复计算,整体速度上来得快一些。

分粒度输出需求多的话,用flatMap数据,再搭配multiinsert写到多个目录,还是蛮方便的。

JVM 内存优化方面,别用太重的对象,数组和基础类型能省一大截。KryoSerializer用起来也比 Java 默认强,快、省。还有 GC 监控一定得开着,-verbose:gc这些参数都加上,方便定位问题。

参数调优里,像spark.shuffle.memoryFractionspark.storage.memoryFraction按场景调,Shuffle 多的就加前者,Cache 多的就加后者。spark.akka.frameSize默认 10MB,大任务建议往上调一点。还有spark.rdd.compress默认是关的,内存紧张可以打开省点空间。

想看源码、扩展阅读可以看看这些文章,挺有的:

如果你最近在调 Spark 作业、觉得卡顿,可以先从这些点下手优化看看。