hive中的优化问题

一、fetch抓取
fetch 抓取是指,hive中对某些情况的查询可以不必使用MapReduce计算。
(1)把hive.fetch.task.conversion 设置成none,然后执行查询语句,都会执行mapreduce程序。

hive(default)>set hive.fetch.task.conversion=none;
(2) 把hive.fetch.task.conversion 设置成more,然后执行查询语句。

二、本地模式

用户可以通过设置 hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。
set hive.exec.mode.local.auto=true; //开启本地 mr

//设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式, 默认为 134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式, 默认为 4
set hive.exec.mode.local.auto.input.files.max=10;
(1) 开启本地模式,并执行查询语句
hive(default)>set hive.exec.mode/local.auto=true;
hive (default)> select * from emp cluster by deptno;
Time taken:1.328seconds,Fetched:14 row(s)
三、表的优化
小表,大表Join
(1)小表,大表Join 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用Group让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce.
(2) 大表 Join 大表 空key过滤
有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而大宋中内存不够。此时需要分析异常的key,很多情况下,这些key我们需要在SQL语句中进过滤
(3)MapJoin
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用Map Join把小表全部加载到内存在map端进行join,避免reducer处理。
1、设置自动选择MapJoin
set hive.auto.convert.join=true;默认为true
(4) Group by
1.开启Map端进行聚合,默认为True
hive.map.agger=true
2.在Map端进行聚合操作的条目数目
hive.groupby.mapagger.checkinterval=100000
3.有数据倾斜的时候进行负载均衡(默认是false)
hive.groupby.skewindata=true
当选项设定为true,生成的查询计划会有两个 MR Job。第一个 MR Job中,Map的输出结果会随机分布到Reducce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key 有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。
(5)Count (Distinct)去重统计
(6)笛卡尔积
尽量避免笛卡尔积,join的时候不加on 条件,或者无效的on 条件,Hive只能使用1个reducer 来完成笛卡尔积。
(7)行列过滤
(8)动态分区调整
(9)分桶
(10)分区
(11)合理设置Map数
(12)小文件进行合并
在map执行前合并小文件,减少map 数:CombineHiveInoutFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
(13)复杂文件增加Map数
(14)合理设置REduce数
(15)并行执行
(16)严格模式
set hive.mapred.mode=strict
(17)JVM 重用
(18)压缩
(19)执行计划

posted @ 2018-12-26 19:58  Z、某某  阅读(264)  评论(0编辑  收藏  举报