一、解决数据倾斜
1. 过滤掉null部分
key值存在大量空字段,会hash到同一reduce,造成reduce长尾,将null 值过滤掉
举例: select user_id from logs where statdate = '20170815' where user_id is not null;
2. hive join倾斜:设置join skew参数解决
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = skew_key_threshold (default = 100000);
3. hive group by distinct倾斜:设置skew参数
set hive.groupby.skewindata=true;
二、合理设置map和reduce的个数
1. 合理设置reduce的个数
set mapred.reduce.tasks = 15;
2. jvm重用
set Mapred.job.reuse.jvm.num.tasks = 10; (重用次数)
节约jvm 启动的时间
3. job间并行执行
set hive.exec.parallel=true; 默认并行度为 8,可以通过 hive.exec.parallel.thread.number参数调整
在有些情况下Job之间是可以并行的,典型的就是子查询。
当需要执行多个子查询union all或者join操作的时候,Job间并行就可以使用了。
例:如下可以并行的场景
select * from ( select count(*) from logs where log_date = 20170801 and item_id = 1 union all select count(*) from logs where log_date = 20170802 and item_id = 2 union all select count(*) from logs where log_date = 20170803 and item_id = 3 )t;