由coalesce(1)OOM引发的coalesce和repartition理解
事件:最后输出文件就20MB,但是用coalesce(1)报错OOM
Task数量严格等于Stage内最后一个RDD的分区数
如果coalesce(1),你以为是数据都算好了再合并文件的。实际上,整个stage的并行度都变了,前面如果有where,各种花式map操作,都是由1个task来处理,很容易out of memory(比如where操作前数据量比较大,都集中在1个task里,哪怕结果文件就一点点)。
如果是repartition(1),这是自带shuffle的,自然就产生了下一个stage,shuffleq前的并行度完全不受影响,该干嘛干嘛,只是最后合成1个文件。自然就是很安全的。
所以对于coalesce,这是会增大内存开销的,谨慎用,确保安全情况用。实在不行用repartition也安全。