Hive的优化

Hive的优化

Hive的运行方式:

开启hive服务 :在服务区端开启hive --service metastore

本地模式:set hive.exec.mode.local.auto=true;

集群模式:set hive.exec.mode.local.auto=false;

​ 注意:hive.exec.mode.local.auto.inputbytes.max默认为128M,超过这个大小,会以集群的方式来运行.

开启并行计算的功能:set hive.exec.parallel=true;

​ 注意:hive.exec.parallel.thread.number(允许并行执行job的最大个数)

严格模式

目的:防止用户的误操作(生产环境)

开启严格模式:set hive.mapred.mode=strict;(默认为nonstrict非严格模式)

-查询限制:
1.对应分区表一般数据量太大不会全表扫描,所有必须添加where对分区字段的条件过滤.

​ 2.order by排序时,数据量如果太大,会撑爆服务器,所有必须包含limit限制输出.

​ 3.限制笛卡尔积的查询(两张表两两匹配,两两组合),如果数据量太大,复杂程度就会太多.

Hive排序优化:

  1. Order by 对查询结果做全排序,只允许有一个reduce处理
  2. Sort by 对于单个reduce的数据进行排序(如果reduce的个数为1,数据量太大,也会导致跟order by一样的效果).
  3. Distribute by分区排序,经常和Sort by 结合使用.
  4. Cluster by 相当于 Sort by +distribute by.

Hive Join 连接:

1.Join计算时,将小表(驱动表)放在join的左边

2.Map join;在Map端完成Join

两种实现方式:

​ 1、SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)

​ 语法:

SELECT  /*+ MAPJOIN(smallTable) */  smallTable.key,  bigTable.value 

​FROM  smallTable  JOIN  bigTable  ON  smallTable.key  =  bigTable.key;

​ 2、开启自动的MapJoin

​ 自动的mapjoin:set hive.auto.convert.join = true;(开启为true时,Hive会自动对左边表统计量,如果是小表,就加入内存,即对小表使用Map join)

​ 相关配置参数:

hive.groupby.mapaggr.checkinterval:

​ -map端group by执行聚合时处理的多少行数据(默认:100000)

hive.map.aggr.hash.min.reduction:

​ -进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置0.5,则不会聚合)

hive.map.aggr.hash.percentmemory:

​ -map端聚合使用的内存的最大值​

hive.map.aggr.hash.force.flush.memory.threshold:

​ -map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush

 hive.groupby.skewindata:

​ -是否对GroupBy产生的数据倾斜做优化,默认为false

Map-Side聚合 count(聚合程度决定是否需要)

​ 通过设置set hive.map,aggr=true;来开启在Map端的聚合;

​ 相关配置参数:

hive.groupby.mapaggr.checkinterval: 

​ -map端group by执行聚合时处理的多少行数据(默认:100000)

hive.map.aggr.hash.min.reduction: 

​ -进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置0.5,则不会聚合)

hive.map.aggr.hash.percentmemory: 

​ -map端聚合使用的内存的最大值

hive.map.aggr.hash.force.flush.memory.threshold:

​ -map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush

hive.groupby.skewindata:

​ -是否对GroupBy产生的数据倾斜做优化,默认为false

控制Hive中Map以及Reduce的数量

​Map一般不会动,只需要修改Reduce

​设置Reudce的数量:set mapred.reduce.tasks=N;(设置N个数量)

设置每一个reduce处理的数据量:set hive.exec.reducers.[bytes].per.reducer(以比特为单位)

​设置每个任务最大的reduce数:set hive.exec.reducers.max(最大个数)

JVM重用

​ 使用场景:小文件个数多,task个数多(大部分时间耽误在申请资源,释放资源上)

​ 通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置(n为task插槽个数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值