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排序优化:
- Order by 对查询结果做全排序,只允许有一个reduce处理
- Sort by 对于单个reduce的数据进行排序(如果reduce的个数为1,数据量太大,也会导致跟order by一样的效果).
- Distribute by分区排序,经常和Sort by 结合使用.
- 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插槽个数)