1.数据倾斜指的是数据分布是不均匀的,导致有的任务执行的快有的任务执行的慢,比如,总共有10000个task,9997个task都在3分钟之内执行完成,但是剩余三个task却要在一两个小时才能执行完或者无法执行完。Hadoop和Spark的任务监控都能看到每个Task的执行时间,当观察到上述现象时就可以确定发生了数据倾斜。产生这种现象的本质是个别task处理的数据量远多于其他task,因为每个task拥有的资源是相同的处理大数据量的task的所需的时间自然要多。
2.数据倾斜绝大部分情况下是因为数据本身有倾斜的特点,绝大部分情况下的数据倾斜是Reduce端的数据倾斜,不代表Map端不会产生数据倾斜
3. Map端产生数据倾斜:多源输入并且文件不可切,且文件大小不一致
优化方案:处理数据时,若发现文件不可切且文件大小不一致,应该留意是否会放生map阶段的数据倾斜,暂无解决方案
4. Reduce端的数据倾斜:数据本身分布不均匀
优化方案:
(1) 大表jion小表。Hive:map side join。Spark:,将小表转化为Map进行广播,广播会将此 Map 发送到每个节点中,如果不进行广播,每个task执行时都会去获取该Map数据,造成了性能浪费。
(2) 大表jion大表,假设BigTableA和BigTableB进行Join。若BigTableA中包含大量重复的key K,BigTableB也存在大量重复的key K。
解决方案:
将BigTableA拆分为两个表A1和A2,其中A1只包含K,A2包含除K外的其他所有key;将BigTableB分拆为两个表B1和B2,其中B1只包含K,B2包含除k外的其他所有key;将A1和B1进行reduce join得到join result 1,将A1和B2进行reduce join得到join result 2,将A2和B1进行reduce join得到join result 3,将A2和B2进行reduce join得到join result 4。将join result 1、join result 2、join result 3、join result 4进行union得到最终的结果。
(3) group by过程出现倾
解决方案:
两阶段聚合:阶段一:修改聚合key进行局部聚合。阶段二:按照原始key进行全局聚合。
Hive:需要将hive.groupby.skewindata设置为true
(4) 增加jvm内存,适用于唯一值,极少数值有非常多的记录值