HIVE SQL 优化
1、reduce 的个数:先看一下跑hive时出现的参数:
in order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
(1)、可以设定number的大小来调整reduce个数;每当数据量大于number时就会多产生一个reduce
(2)、In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
指定reducer的最大个数,如果同时指定了 set hive.exec.reducers.bytes.per.reducer = <number>,
set hive.exec.reducers.max = <number> 的优先级大,会覆盖上面那个参数
(3)、In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
指定 set mapreduce.job.reduces = <number>指定reduce的个数,这个参数的优先级大于以上两个
2、where 条件使得 group by 冗余
在写代码时,where已经限定了条件,此时不需要group by ,加上会增加运行的负担(group by 会进行分区,会运行多个reduce,增加不必要的损耗)
3、只有一个reduce情况
(1)、没有group by :即使设置了reduce的个数也不会变;
(2)、order by:全局排序只产生一个reduce
(3)、笛卡尔积:单纯的两个表join时(没有 on 条件)会发生笛卡尔积,此时只有一个reduce
4、map join :
select /*+ MAPJOIN(a) +*/ a.product_id,b.aisle from a join b on xxx
map join的使用条件;
(1)、当发生小表 join 大表时,可以mapjoin(小表)将小表存入内存中,在map端join(0.7之前需要加
/*+ MAPJOIN(a) +*/ ,0.7之后由参数hive.auto.convert.join=true控制);小表的阈值:
set hive.mapjoin.smalltable.filesize = 25000000 (25M)
设置可以使用多大的内存来存储数据(默认为内存的0.55):
set hive.mapjoin.followby.gby.localtask.max.memory.usage = 0.55
(2)、当两个表不等值连接时,也经常使用mapjoin
5、union all / distinct == union
union all 与 union 用于将多个select查询语句结果合并到一个结果里(union 将查询到的结果去重)
union all 不会去重,但在查询时加上distinct有同样的效果。
因为union要进行重复值扫描,所以效率比 union all/distinct 低。
6、数据倾斜
set hive.groupby.skewindata = true
当出现数据倾斜时,设置hive.groupby.skewindata = true 可将一个mapreduce任务拆分成两个
使用情景:凌晨定时任务,需要报表;洗出来的基本表
7、MR 的数量
1个MR:
select
ord.order_id order_id,
tra.product_id product_id,
pri.reordered reordered
from orders ord
join trains tra on a.xx=b.xx
join priors pri on a.xx=c.xx
2个MR
select
ord.order_id,
tra.product_id,
pro.aisle_id
from orders ord
join trains tra on a.xx=b.xx
join products pro on b.xx=c.xx
/*+ STREAMTABLE(a) */ 指定一个大表
8、设置mapreduce是同步执行还是异步执行
set hive.exec.parallel=true
(1)、同步执行:map执行完再执行reduce
(2)、异步执行:map和reduce一起执行
9、怎么定位哪几个key发生倾斜:
可以使用分桶:bucket然后sample抽样