Spark shuffle失败的可能原因 及解决办法
大数据Spark任务中,分区数过小,每个分区的数据量会很大,执行join、crossjoin的过程,有可能导致shuffle write失败的操作。 可能原因包括:
- executor.memory内存不足,导致相应比例的nio资源不足,
- executor.memoryOverhead不足,没有足够的nio资源,从而导致失败。
其他的可能导致shuffle write失败或者节点访问异常的原因: executor--cores数目过大,适当降低executor-cores,增加num-executors,不降低运行速度,但是每个executor的内存需求降低,shuffle write失败的问题可以避免。
repartition后,增大分区数,减小每个分区的数据量,可以总体避免上述问题,但是如果设置分区过大,可能造成如下的问题:
1) 频繁的创建task,并行的running数目一直在变化的,比如最大是可能task数700,执行完639个后,剩下61个task还在执行这一批,从而显示出还有61个running,频繁的创建任务消耗大量资源
2)高并发执行完小的/均匀的分区后,最后剩余的部分分区,可能因为划分不均匀,反而只利用少量task资源,导致耗时超长。