Hive应用(4.1)调优

1.limit优化

limit语句默认情况下是在查询所有结果后再返回部分结果,这样会造成资源浪费,可以通过参数控制这一行为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 使用抽样数据代替完整扫描所有数据 -->
<property>
<name>hive.limit.optimize.enable</name>
<value>true</value>
</property>

<!-- 抽样最大数量 -->
<property>
<name>hive.limit.row.max.size</name>
<value>100000</value>
</property>

<!-- 抽样最大文件数量 -->
<property>
<name>hive.limit.optimize.limit.file</name>
<value>10</value>
</property>

limit优化也会导致部分数据可能永远无法被处理

2.JOIN优化

将大表放到JOIN的右边

3.本地模式

数据量较小时,任务执行时间甚至会小于任务触发的时间,使用本地模式进行单机处理可以有效提升效率

1
2
3
4
<property> 
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>

4.并行执行

Hive会把查询转换成多个stage,默认情况下一次执行一个stage,启用并行执行可以同时执行多个stage,但是也会使集群的利用率增加。

1
2
3
4
<property>
<name>hive.exec.parallel</name>
<value>true</value>
</property>

5.严格模式

严格模式可以防止一些过度消耗资源的查询产生:

  1. 分区表查询时WHERE中没有分区过滤字段:简而言之不允许扫描所有分区,分区表通常数据量非常庞大。
  2. ORDER BY语句必须要LIMIT:ORDER BY会将所有数据分发到一个reducer中进行排序,如果数据太大将非常耗时
  3. 限制笛卡儿积查询