spark 之所以需要调优,一是代码执行效率低,二是经常 OOM
内存溢出
内存溢出无非两点:
1. Driver 内存不够
2. Executor 内存不够
Driver 内存不够无非两点:
1. 读取数据太大
2. 数据回传
Executor 内存不够无非两点:
1. map 类操作产生大量数据,包括 map、flatMap、filter、mapPartitions 等
2. shuffle 后产生数据倾斜
Executor 内存不够
有个通用的解决办法就是增加 Executor 内存
--executor-memory MEM Memory per executor (e.g. 1000M, 2G) (Default: 1G).
但这并不一定是最好的办法
map 过程产生大量对象
造成 Executor 内存溢出
解决思路是减少每个 task 的大小,从而减少每个 task 的输出;
具体做法是在 会产生大量对象的 map 操作前 添加 repartition(重新分区) 方法,分区成更小的块传入 map
rdd.flatMap(lambda x: ['%d'%x*50 for _ in range(100000000)]).count() #100 * 100000000 个对象,内存溢出
rdd.flatMap(lambda x: len(['%d'%x*50 for _ in range(100000000)])).sum() #内存溢出
rdd.repartition(1000000).flatMap(lambda x: ['%d