什么是数据倾斜:
数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。
例如以下情况:
- 用Hive算数据的时候reduce阶段卡在99.99%
- 用SparkStreaming做实时算法时候,一直会有executor出现OOM的错误,但是其余的executor内存使用率却很低。
- 数据倾斜有一个关键因素是数据量大,可以达到千亿级。
1. 优化数据源,从源头避免
如果导致数据倾斜的表时Hive表,而Hive表中数据的分布很不均匀,而业务需要频繁的对Hive表执行某个分析操作,那么我们可以尝试使用Hive ETL预处理数据(按key进行聚合,或预先和其他表join)。 之后所有操作针对的数据源就不是原来的Hive表了,而是预处理之后的Hive表。 不过需要注意的是,因为数据本身存在分布不均匀的问题,所以在Hive ETL过程中还是会存在数据倾斜,导致Hive ETL速度很慢。我们只是把数据倾斜的发生提前到了Hive ETL中。 方案优点:执行起来简单便捷,效果还很好。 方案缺点:Hive ETL过程中还是会发生数据倾斜。
2. 增加并行度
手动的对shuffle算子传入一个参数,该参数设定了shuffle算子执行时shuffle read task的数量,通过增大这个数量,将原本需要分配到1个task上的key,被分配给了多个task,那么每个task的执行时间自然就短了。 方案优点:实现起来比较简单,可以有效缓解数据倾斜的影响。 方案缺点:只是缓解了数据倾斜而已,并