一原理:
hive根据计算引擎有
mapreduce:转换为mr任务,分成map阶段,reduce阶段。中间有shuffer
spark:转换为sprak的任务,基于RDD,分成一个一个的stage执行
Tez:HADOOP2.x的重要引擎、把map和reduce拆成一个个的单元,可以随意组合这些单元
二思路:
1.减少数据量
2.join/group避免数据倾斜,避免有shuffer
3.根据文件大小,资源情况,合理设置参数。
三对应操作:
一.减少数据量
1.分区裁剪,列裁剪
设置分区。(静态分区和动态分区)
不要select *
2.谓词下推(where和join的条件下推)
两表join,关联和where的限制都会下推到两个表里面。
两表full join。关联和where的限制,都不会下推到两个表里面
left/right join。where 中的条件会下推到主表中,但不会下推到副表中。on的条件会下推到副表中,但是不会下推到主表中
3.嵌套查询。先在查询里面过滤好数据
4.小文件太多,可以合并一下小文件
二.join/group 优化。
1.group by代替distinct。避免只有一个reduce
2.join的时候大表和小表关联。使用mapjoin。小表的大小是否满足条件(默认25MB)。注意hdfs上面的大小是压缩后的
3.join大表和大表关联。使用bucketjoin。需要表都是分桶表,join字段是分桶的字段。大表的分桶是小表分桶的整数倍。
4.数据倾斜。
group引起的数据倾斜。设置参数在map端先预聚合,再reduce端聚合(思想也是加盐去盐)
join引起的数据倾斜。
1.join的一张表有很多null值。给null值做一个随机的无意义值
2.join的一张表的数据本身的key分布不均匀,可以把key单独拿出来,或者说说关联的时候用随机值关联,然后后面再进行一层汇总。
5.多个表相同key的join只有一个job。
6.可以先union再关联
7.join时:不同数据类型关联产生数据倾斜
比如两个表联接,联接的字段是userid,一个表的userid是string类型,一个表的是int类型,那这样默认按照int来计算哈希的话,那么string类型的都会被分到同一组,易发生数据倾斜
三调整参数
1.hive.map.aggr = true
会先在map端聚合
2.调整map或者reduce的个数