数据倾斜报错

问题描述/异常栈

数据倾斜报错

解决方案

可尝试添加以下参数

是否开启map端聚合任务,默认值是true  
set hive.map.aggr = true;

Map 端组聚合哈希表将使用的最大内存。如果内存使用量大于此数量,则强制刷新数据。默认0.9  
set hive.map.aggr.hash.force.flush.memory.threshold = 0.9;

默认0.5,表示开启map任务的聚合所使用到的hash表,所能占用到整个Map被分配内存够的50%。  
set hive.map.aggr.hash.percentmemory = 0.5

是否启用倾斜连接优化,默认false  
set hive.optimize.skewjoin = true;

如果作为join 连接项的键超过了这个行数,可以视为数据倾斜键。默认10000  
set hive.skewjoin.key = 10000;

确定在后续 Map 连接作业中用于偏斜连接的 Map 任务的数量,和hive.skewjoin.mapjoin.min.split一起配合使用  
set hive.skewjoin.mapjoin.map.tasks = 10000;

通过指定最小拆分大小,确定在后续 Map 连接作业中用于偏斜连接的最多 Map 任务数,默认33554432  
set hive.skewjoin.mapjoin.min.split = 33554432;

是否在编译的时候根据Hive metastore中元数据为数据倾斜的倾斜键分配单独的连接。一个作为正常的连接。最后两个做并集计算,注意,如果元数据中没有记录这些统计信息的话,该配置项不会生效,默认false  
set hive.optimize.skewjoin.compiletime = true;

问题原因

由于数据倾斜,大表join大表导致数据切斜

作者:焦巍