hive有时执行速度很慢,若hive on spark 的话,在sparkUI上可以清楚看到是否数据倾斜
优化方法:
1、增加reduce数目
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
在只配了hive.exec.reducers.bytes.per.reducer以及hive.exec.reducers.max的情况下,实际的reduce个数会根据实际的数据总量/每个reduce处理的数据量来决定。转自链接:https://www.jianshu.com/p/42be5ca8b11d。
mapred.reduce.tasks = 15;直接指定实际运行的reduce数目
虽然设置了reduce的个数看起来好像执行速度变快了。但是实际并不是这样的。同map一样,启动和初始化reduce也会消耗时间和资源,另外,有多少个reduce,就会有多少个输出文件,如果生成了很多小文件,那这些小文件作为下一次任务的输入,则也会出现小文件过多的问题。
2、设置hive.map.aggr=true //开启map端部分聚合功能
3、设置hive.groupby.skewindata=true //如果发生了数据倾斜就可以通过它来进行负载均衡
4、大小表的join,让小表进内存去join大表
5、大表之间的join,需要对空值进行过滤或处理