1.概述

     hive优化是个很复杂的工作,如果优化做的好,可以将任务运行时间缩短几倍甚至10几倍。在优化之前,需要对mapreduce任务的运行过程有个大概的认知,也需要对任务本身有个大致的了解,才能更好的根据任务运行情况(主要通过日志分析)来进行调优工作。以下是一些常见的调优手段,可以尝试以下。

 

2.学会使用explain [extend]

该关键字可以打印hive将查询转换为MapReduce任务的过程。

hive> explain select count(*) from test;

尽管我们的查询会将其输出写到控制台,但hive实际会先将输出写入一个临时文件中。

 

stage:一个hive任务会包含有一个或多个stage(阶段),不同的stage间会存在着依赖关系,一个stage可以是一个MapReduce任务,一个抽样阶段或者一个合并阶段等,默认情况下,hive会一次只执行一个stage(阶段)。--(好了,这里就是一个优化点,并行)

 

limit -1:表示全部输出

 

3.Join优化

1.如果一个表足够小,可以完全载入内存中,那么这时候hive可以执行一个map-side Join,这样可以减少reduce的压力。也可以降低IO负载。

hive> set hive.auto.convert.join=true;
hive> set hive.map.aggr=true;

hive.groupby.skewindata----<数据倾斜>

2.小表放在左边

 

4.本地模式

对于数据量特别小的情形,优化效果特别明显。

hive> set hive.exec.mode.local.auto=true;

 注意:hive.exec.mode.local.auto.inputbytes.max默认值为128MB,表示如果加载文件的最大值,如果大于该配置。则仍然会以集群模式运行。

5.并行执行

hive会将查询转换成一个或者多个stage,这样的阶段可以是MR阶段、抽样阶段、合并阶段、limit阶段或hive执行过程中可能需要的其他阶段,默认hive一次只会执行一个阶段,不过某个特定的Job可能包含的总多stage并非完全相互依赖的。也就是说,有的阶段是可以并行执行的,这样使得Job的时间缩短,以及资源的充分利用。

hive> set hive.exec.parallel=true;
hive> set hive.exec.parallel.thread.number=8;    ---(同时可以允许的Job的最大值,默认值为8)

6.严格模式

设置严格模式

hive> set hive.mapred.mode=strict;    (非严格为nonstrict)

查询限制:1.对于分区表,必须添加where对于分区字段的条件过滤

                2.order by语句必须包含limit输出限制(order by会交给一个reduce执行)

                3.限制笛卡尔积的查询

 

7.排序

order by:对于查询结果全排序,只允许有一个reduce处理。(数据量大时要慎用)

sort by:对于单个reduce的数据进行排序

distribute by:分区排序。经常和sort by结合使用。例如:distribute by clumn sort by column asc|desc

cluster by:相当于sort by + distribute by,但是不能指定ASC,DESC的排序规则

 

8.调整map-reduce个数

map:

mapred.max.split.size               (一个split的最大值,即每个map处理文件最大值)
mapred.max.split.size.per.node      (一个节点上split的最小值)
mapred.max.split.size.per.rack      (一个机架上split的最小值)

reduce:

mapred.reduce.tasks                 (强制指定reduce数量)
hive.exec.reduces.bytes.per.reduce   
hive.exec.reduces.max               (每个任务最大的reduce数)

9.combine使用

以后有机会说!