1、计算数据优化
计算数据优化主要有两种思路,一种是减少处理数据量;一种是解决数据倾斜。数据倾斜一般可以分为三种:
- Mapper阶段数据倾斜
- Join阶段数据倾斜
- Reduce阶段数据倾斜
1.1 Mapper阶段数据倾斜
主要有两种方式:
- 可以修改读取数据的表的任务,最后插入数据时按照均衡的key值重新分布。也就是在最后加上distribute by ***
- 如果Mapper的任务数比较少,比如200以内,可以考虑增加Mapper的任务数,从而减少单个任务的处理数据量和执行时间。
1.2 Join阶段数据倾斜
是最常见的数据倾斜,按照表的大小和join方式的不同分别有多种处理方式。
1.2.1 Mapjoin
作用:
- mapjoin可以把小表全部读入到内存,然后发送到大表所在的服务器处理,所有的逻辑都在map端完成,不需要reduce端从而避免倾斜。
适用场景:
- 大表inner join小表
- 大表left outer join小表
- 小表right outer join大表
不适用场景:
- 小表left outer join大表
- 大表right outer join小表
- 小表full outer join大表
限制:
- hive小表默认大小不能超过25M,可以调整hive.mapjoin.smalltable.filesize来。
- hive 0.7版本以后,可以通过设置set hive.auto.convert.join = true 自动优化。
'''
set hive.auto.convert.join = true
'''
使用mapjoin,只有map,没有reduce任务
1.2.2 Mapjoin+left join
作用:
- 主要是为了解决小表在left outer join左侧从而无法直接使用mapjoin的问题。通过”小表 left outer join(小表 mapjoin 大表)”这样的方式来实现优化。
适用场景:
- 小表left outer join大表
- 大表right outer join小表
1.2.3 先group by再mapjoin
作用:
- 先把某个大表按照关联key做group by,来减少关联时的数据量,然后把group by的结果当作mapjoin的小表再做关联。
适用场景:
- 大表a左关联/内关联大表b,其中大表b的join key的distinct值数量比较少。