hive的性能调优

hive的性能调优

一.严格模式

通过设置以下参数开启严格模式:
  >set hive.mapred.mode=strict;【默认为nonstrict非严格模式】
  查询限制:
    1.对于分区表,必须添加where查询条件来对分区字段进行条件过滤。
    2.order by语句必须包含limit输出限制。
    3.限制执行笛卡尔积的查询。

二、Hive开启本地模式执行

0.7版本后Hive开始支持任务执行选择本地模式(local mode),如此一来,对数据量比较小的操作,就可以在本地执行,这样要比提交任务到集群执行效率要快很多。
方式1(临时开启,重启后无效)
配置语句:
配置如下参数,可以开启Hive的本地模式:

hive> set fs.defaultFS=file:///
hive> set hive.exec.mode.local.auto=true;(默认为false)

注:
运行hive> set hive.exec.mode.local.auto=true;(默认为false);
当一个job满足如下条件才能真正使用本地模式:
1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
3.job的reduce数必须为0或者1
但是你会发现job确实是以本地模式运行了(看job名字就能看出来,中间有local字样),但是还是会报错,各种找不到jar包。
这里还要运行一个语句:set fs.defaultFS=file:///
然后你再去执行前面的那条语句,可以正常运行了,执行实现只需要几秒钟而已,我们能够很快的看到执行结果了。
方式2(长期有效)

#进入hive配置文件目录
cd  /hive//usr/local/src/hive-1.2.1/conf
#进入配置文件
vi hive-site.xml
#修改配置文件
Ctrl+:exec.mode.local.auto
#把false改为true
#Shift+zz保存并退出

三.Hive排序

1.order by:对于查询结果做全排序只允许有一个reduce处理,当数据量较大时,应慎用。严格模式下必须结合limit来使用。
2.sort by:对于单个reduce的数据进行排序。
3.distribute by:分区排序,经常和sort by结合使用。
4.cluster by:相当于sort by + distribute by【cluster by不能通过asc,desc的方法指定排序规则,可通过distribute by column sort by column asc|desc的方式】

四.Hive Join

1.join计算时,将小表放在join的左边。
2.map join,在Map端完成join,实现方式:
    2.1sql方式,在sql语句中添加mapjoin标记【mapjoin hint】

语法:select /*+MAPJOIN(smallTable) */ smallTable.key,bigTable.value from smallTable JOIN btTable ON smallTable.key = bigTable.key;

2.2开启自动mapjoin,通过设置一下配置启动自动的mapjoin

set hive.auto.convert.join = true;【该参数为ture时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表用mapjoin】

相关参数配置:

>hive.mapjoin.smalltable.filesize;【大小表判断阈值,表的大小小于该值则为小表,加载到内存中】
>hive.ignore.mapjoin.hint;【默认值为true,是否忽略mapjoin hint即mapjoin标记】
>hive.auto.convert.join.noconditionaltask;【默认值为true,将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin】
>hive.auto.convert.join.noconditionaltask.size;【将多个mapjoin转化为一个mapjoin时,列表的最大值】

五.Map-Side聚合

通过设置以下参数开启在map端的聚合:set hive.map.aggr=true;
  相关参数配置:

>hive.groupby.mapaggr.checkinterval:map端group by执行聚合时处理的数据条数【默认100000】
>hive.map.aggr.hash.min.reduction:进行聚合的最小比例【预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置【默认0.5】则不聚合】
>hive.map.aggr.hash.percentmemeory:map端聚合使用的内存的最大值
>hive.map.aggr.hash.force.flush.memory.threshold:map端做聚合操作时hash表的最大可以容量,大于该值则会触发flush
>hive.groupby.skewindata:是否对groupby产生的数据倾斜做优化,默认为false

六.控制hive中map和reduce的数量

map数量相关参数:

mapred.max.split.size:一个split的最大值,即每个map处理文件的最大值
maprd.min.split.size.per.node:一个节点上split的最小值
mapred.min.split.size.per.rack:一个机架上split的最小值

reduce数量相关参数:

mapred.reduce.tasks:强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer:每个reduce任务处理的数据量
hive.exec.reducers.max:每个任务最大的reduce数

七.JVM重用

适用场景:
    1.小文件个数过多
    2.task个数过多
  通过执行:set mapred.job.reuse.jvm.num.tasks=n;来设置task插槽个数
  缺点:
    设置开启后,task插槽会一直占用资源,不论是否有task,直到所有的task即整个job执行完成后才会释放所有的task插槽资源!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值