一、数据倾斜本质
数据在各Map task或Reduce task上分配不均匀,数据量过大的task会拉长整个任务的执行时间。
二、表现
某个map task运行时间明显长于其他task。并且该task的数据量明显大于其他task。针对Map task,看INPUT_SPLIT_LENGTH_BYTES,该参数表示map task的输入数据量,和OUTPUT_BYTES_PHYSICAL,表示map task的输出数据量;针对Reduce task,看SHUFFLE_BYTES,表示shuffle输出,也就是reduce输入的数据量。
三、Map端数据倾斜
1. Map join时数据倾斜
(1) 原因
大表和小表join时,启用map join会把小表存储在读取到HashTable中并分发到大表的各map task内存中,进行join操作。当大表的map task数据量分布不均匀时,会产生数据倾斜。或者当join产生笛卡尔积时,会产生数据倾斜。
(2) 解决
可通过改变Map端切片方式,减少Map端Task的输入量,增加Map端Task数量来解决。
set hive.tez.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapreduce.