什么是数据倾斜
数据倾斜就是在多个节点之间,处理数据的压力不一样,有点节点比较忙,但是有点节点比较轻松,这个就是发生了数据倾斜。
产生的原因
1、数据本身具有倾斜的特性 - 数据本身就是不平均的 - 所以数据倾斜不能避免
2、map端可能会发生数据倾斜。产生的条件三者缺一不可,分别是:多源输入、输入的文件不可切且大小不均等(从而导致有点mapTask任务重有点轻)—— 三个条件缺一不可,而且Map端的数据倾斜无法避免而且无法解决
3、实际生产过程中,reduce端的数据倾斜更多。绝大部分的数据倾斜都是发生在了Reduce端 - Reduce端产生数据倾斜的本质原因是因为数据本身具有倾斜特性,但是Reduce端产生倾斜的表面原因是因为数据的分类(分区操作)
reduce端数据倾斜解决方案
针对Reduce端的数据倾斜,经常采用的方案:二/两阶段聚合
两阶段聚合方案
1、先将数据打散,打散之后先分别聚合
2、按照业务指定分类,对数据进行最后的汇总
第一阶段,先将数据完全打散,将数据随机分配到多个分区上进行计算。需要考虑分区的维度。比如说姓名,月份,原本是按照月份进行分区,但是如果直接按照月份进行分区时会出现数据倾斜;所以先将所有的数据随机分配到不同的reduce节点,然后根据(姓名,月份)作为联合主键进行汇总统计。
第二阶段将第一个阶段的输出结果作为输入,对月份进行分区,在每一个分区按照名称进行汇总求和。(有点多级reduce的意思)