Spark数据倾斜解决方案及shuffle原理
数据倾斜调优与shuffle调优 数据倾斜发生时的现象 1)个别task的执行速度明显慢于绝大多数task(常见情况) 2)spark作业突然报OOM异常(少见情况) 数据倾斜发生的原理 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。以至于大部分task只需几分钟,而个别task需要几小时,导致整个task作业需要几个小时才能运行完成。而且如果某个task数据量特别大的时候,甚至会导致内存溢出的情况。 定位数据倾斜发生的位置 数据倾斜只会发生在shuffle过程中,因此我们要先确定数据倾斜发生在第几个stage中,我们可以通过Web UI来查看当前运行到了第一个stage,以及该stage中各个task分配的数据量,来确定是不是由数据分配不均导致的数据倾斜。 一旦确定数据倾斜是由数据分配不均导致,下一步就要确定数据倾斜发生在哪一个stage之后,根据代码中的shuffle算子,推算出stage与代码的对应关系,判定数据倾斜发生的位置。 数据倾斜的解决方案 1)使用Hive ETL预处理数据 适用场景 :Hive里的源数据本身就不均匀,并且需要对Hive表频繁进行shuffle操作 解决方案 :在Hive中预先对数据按照key进行聚合或是和其他表进行join