1.coalesce滥用导致saveAsTextFile数据保存很慢
rdd.coalesce(1).saveAsTextFile(SAVE_PATH)
转换成:rdd.coalesce(1, True).saveAsTextFile(SAVE_PATH)
或:rdd.repartition(1).saveAsTextFile(SAVE_PATH)
coalesce:分区时没有shuffle操作
repartition:分区时进行了shuffle操作。
coalesce()其实是repartition()的接口封装函数,即可用repartition(num)的都可用coalesce(num,True)代替,而coalesce(num)则无法用repartition(num)代替。
coalesce没有shuffle,整个过程都属于一个阶段,因此最终该过程的task数量是1,尽管我在最开始分了50个分区,没用!系统只会分给我1个task【相当于分区并行化操作失效】。
但repartition就不一样了,因为有shuffle操作,整个过程被repartition分为两个stage,两个stage互不干扰。stage1是数据读入和处理,因为我分了50个分区,所以系统就会给我50个task,stage2是数据保存,我将最终分区数定为1,那么该阶段的task就是1。
侬瞧瞧,两张图片中可以明显看出coalesce(1)引起的灾难性的效率问题。所以,请慎用coalesce(1)!