hive调优

1、 feach

不走mr

能够不适用mr的时候尽量不适用mr。
hive.feach.task.conversion 的配置有none、minimal、more。
hive的默认配置是more.
设置为more后,下面hql都不执行mr.
select * from xxx;
select a from xxx;
select a from xxx limit 3;

2、 本地模式

如果存在很多小文件,每个小文件都要开启mr程序,会极大的浪费资源。所以可以开启本地模式,进行小文件合并。
 //开启本地mr
set hive.exec.mode.local.auto=true; 
//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=51234560;
//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;

3、表join

小表join大表,会一次性将小表加载到内存中,
与大表进行join
现在的hive内部会有一个优化器,会自动选择小表

过滤空id

//空id全部没有join上
select a.* from a jon b on a.id=b.id;
//过滤掉空的id,数据量变少
select a.* from (select * from a where id is not null) join b on a.id=b.id;

空key转换

如果为null  id的数据不能过滤掉,那么我们可以使用空key的转换
set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN 'hive' ELSE a.id END = b.id;
//此时key全部转换为hive字段,
//不过如果空key数据比较多,
//那么可能会导致数据倾斜。
//此时可以使用随机字符串
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id END = b.id;

4、map端join

新版本当中小表join大表,以及大表join小表没有区别了

开启map端的join功能
set hive.auto.convert.join = true; 默认为true

5、group by

在map端先进行一次聚合,类似于规约。
(1)是否在Map端进行聚合,默认为True
set hive.map.aggr = true;
(2)在Map端进行聚合操作的条目数目
    set hive.groupby.mapaggr.checkinterval = 100000;
(3)有数据倾斜的时候进行负载均衡(默认是false)
    set hive.groupby.skewindata = true;
 此时会开启两个mr,第一个mr将数据均匀分发到reduceTask,每个reduce做部分聚合。然后下一个mr进行全局聚合

6、去重 distinct

直接去重,只有一个reduceTask,数据处理会比较慢。
可以先分组,在进行操作

7、笛卡尔积

任何时候一定要避免笛卡尔积
join的时候要避免无效join

8、分区裁剪、列裁剪

分区的时候一定要带上分区字段
select的时候只取用我们需要的字段
where后面要跟上过滤条件。
先过滤在join

9、动态分区

insert overwrite table xxx partition(p_time)
select s_id,p_time from xxx; 
//不需要手动指定分区,会自动根据源表进行动态分区

10、分桶

如果单个文件过大,可以采用分桶表

11、数据倾斜

控制map个数

减少map个数

一个,调整block块的大小
二个。合并小文件
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并。
大于128M的文件,按照128M来进行切分
100到128按照100进行切分
切分剩下的小文件,进行合并

增加map个数

可以使用distributed  by将文件打散。

控制reduce个数

方法一调整  估算reduce个数
(1)每个Reduce处理的数据量默认是256MB
hive.exec.reducers.bytes.per.reducer=256123456
	(2)每个任务最大的reduce数,默认为1009
hive.exec.reducers.max=1009
(3)计算reducer数的公式
N=min(参数2,总输入数据量/参数1)

方法二直接调整
)调整reduce个数方法二
在hadoop的mapred-default.xml文件中修改
设置每个job的Reduce个数
set mapreduce.job.reduces = 15;

12、执行计划

使用执行计划查看hql执行过程
explain select * from course;

13、严格模式

不能执行笛卡尔积
order by 需要带 limit
分区表要带上分区字段

14、并行执行

set hive.exec.parallel=true;              //打开任务并行执行
set hive.exec.parallel.thread.number=16;  //同一个sql允许最大并行度,默认为8。

select  *  from  a  union  select  * from  b 

15、jvm重用

container执行完mapTask或者reduceTask后,不释放资源
继续给下一个mapTask或者reduceTask使用
  set  mapred.job.reuse.jvm.num.tasks=10;

16、推测执行

关闭推测执行

17、压缩

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值