hive调优一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qzqanzc/article/details/88998357

1 . join 优化

  • 当对多个表进行join时,如果每个on子句都使用相同的连接键,这种情况下只会产生一个MapReduce job。
  • Hive 同时假定查询中最后一个是最大的那个表。在对每条记录进行连接操作时,它会尝试将其它表缓存起来,然后扫描最后那个表进行计算。因此,用户需要保证连接查询中的表大小从左往右依次增加。
  • map-side JOIN : 如果所有表中只有一张表时小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。Hive 可以在map端执行连接过程。Hive 可以和内粗中的小标进行逐一匹配,从而省略掉常规连接操作所需的reduce过程。

2 . order by 和sort by

  • order by 对其查询结果执行全局排序。这也就是说所有的数据都会通过一个reducer 进行处理。
  • sort by 其会对每个reducer 中的数据进行排序,是一个执行局部排序的过程。可以提高全局排序效率。

3 . 同一份数据多种处理

insert overwrite table sales 
select * from history where action='purchased';
insert overwrite table credits
select * from history where action='returned';

下面的会比上面的sql效率高

from histroy
insert overwrite sales select *  where action='purchased'
insert overwrite credits select *  where action='returned';

4 . 本地模式

对于小规模的输入数据,hive 可以通过本地模式在单台机器上处理所有任务。

set oldjobtracker=${hiveconf:mapred.job.tracker};
set mapred.job.tracker=local;
set mapred.tmp.dir=/home/wdward/tmp;

5 . 并行执行

Hive 将一个查询转化为一个或多个阶段,这样的阶段可以试MapReduce阶段,合并阶段,limit 阶段,或者是Hive 执行过程中的其他阶段。而这些阶段并不是完全相互依赖的,也就是说某些阶段可以并行执行的。

<property>
    <name>hive.exec.parallel</name>
    <value>true</value>
    <description>Wether to execute jobs in parallel</descrption>
</property>

6 . 严格模式

set hive.mapred.mode=strict
  • 对于分区表,除非where 语句中包含分区字段过滤条件来限制数据范围,否则不允许执行
  • 对于使用order by 语句查询,要求必须使用limit语句。因为order by 为了执行排序过程会将所有结果数据分发到同一个reducer中处理,强制要求limit 语句可以防止reducer 额外执行很长一段时间。
  • 限制使用笛卡儿积

7 . 调整mapper 和 reducer 个数

8 . JVM 重用

JVM 重用是Hadoop 调优参数的内容,其对Hive有非常大的影响,特别是对于很难避免的小文件场景或task 特别多的场景,这类场景大多数执行时间都比较短。
Hadoop 默认配置通常是使用派生JVM来执行map和reduce任务。这是jvm 启动过程可能会造成相当大的开销,尤其是其执行的job 包含成百上千个task 任务的情况。JVM 重用可以使得JVM 实例在同一个job 中重新使用N次。N的值可以在Hadoop 的mapred-site.xml文件中进行配置:

<property>
   <name> mapred.job.reuse.jvm.num.tasks</name>
   <value>10</value>
   <description>How many tasks to run per jvm,If set  to -1,there is no limit </description>
</property>

9 . 索引

索引用来加快包含有Group by 语句查询的计算速度

10 . 动态分区调整

动态分区insert 语句可以通过简单的select 语句向分区表中创建很多新的分区。但是如果分区数目特别多,那么就会在系统中产生大量的输出控制流。Hive 可以通过配置限制动态分区允许创建的分区数为一个固定值,不过,通常还是将这个值设置比较大一边在这些查询执行。

<property>
	<name>hive.exec.max,dynamic.partitions</name>
	<value>30000</value>
</property>
<property>
   <name>hive.exec.max.dynamic.partitions.pernode</name>
   <value>10000</value>
   <description>Maxinum number of dynamic partitions allowed to  be create in each mapper/reducer node</description>
</property>

hive-site.xml 配置文件中设置动态分区模式为严格模式。开启严格模式的时候,必须保证至少一个分区是静态的。

<property>
	<name>hive.exec.dynamic.partition.mode</name>
	<value>strict</value>
	<description>In strict mode,the user must specify at least one static partition in case the user accidentally overwrites all partitions</description>
</property>

11 . 单个MapReduce 中多个Group By

试图将查询多个GROUP BY 操作组装到单个MapReduce 任务中。

<property>
	<name>hive.multigroupby.singlemr</name>
	<value>false</value>
</property>

猜你喜欢

转载自blog.csdn.net/qzqanzc/article/details/88998357
今日推荐