1.情况
- 两表join 其他时间数据正常插入。唯独插入7月1日数据时 , 报错:
insert overwrite table A
partition (log_date= '20210701')
select a.id,a.name,b.age from employees e left join b on a.id=b.id
where a.log_date= '20210701' and b.log_date= '20210701'
INFO : Total MapReduce CPU Time Spent: -1 msec
INFO : Stage-Stage-1: HDFS Read: 2872700580746 HDFS Write: 13674470480571 FAIL
INFO : MapReduce Jobs Launched:
ERROR : FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
ERROR : Ended Job = job_1626955970433_229281 with errors
com.bilibili.dispatcher.lib.exception.DispatcherException: execute failed
2021-07-23 18:33:44 249 attempt to execute on HIVE_SERVER failed [USER_ERROR:EXECUTE_FAILED:1004]
2.分析
- 为什么唯独7月1号数据异常?是不是这天数据量过大?
- 两表join时,shuffer过程中导致导致同一同一分区可以过大 导致reduceTaks 数据分布不均匀?
- 方案1 : mapjoin 不行 mapJoin 做多建议表的大小为2G 但是单表过大
- 方法2 : 设置 reduceJoin将超过阈值的key 写入文件 再启用一个mapJob
3.解决
# join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.skewjoin.key=10 0000;
# 如果是join过程出现倾斜应该设置为true
set hive.optimize.skewjoin=true;