hive------几种hive优化方法

hive的优化

1.通过explain或者explain extended来查看执行计划。

explain
select * 
from u3;

//执行结果
------------------------------------------
STAGE DEPENDENCIES:
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        TableScan
          alias: u3
          Statistics: Num rows: 1 Data size: 43 Basic stats: COMPLETE Column stats: NONE
          Select Operator
            expressions: id (type: bigint), name (type: string), sex (type: tinyint)
            outputColumnNames: _col0, _col1, _col2
            Statistics: Num rows: 1 Data size: 43 Basic stats: COMPLETE Column stats: NONE
            ListSink
Time taken: 0.457 seconds, Fetched: 17 row(s)

加上extended

explain extended
select * 
from u3;
---------------------------
 
ABSTRACT SYNTAX TREE:
  
TOK_QUERY
   TOK_FROM
      TOK_TABREF
         TOK_TABNAME
            u3
   TOK_INSERT
      TOK_DESTINATION
         TOK_DIR
            TOK_TMP_FILE
      TOK_SELECT
         TOK_SELEXPR
            TOK_ALLCOLREF


STAGE DEPENDENCIES:
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        TableScan
          alias: u3
          Statistics: Num rows: 1 Data size: 43 Basic stats: COMPLETE Column stats: NONE
          GatherStats: false
          Select Operator
            expressions: id (type: bigint), name (type: string), sex (type: tinyint)
            outputColumnNames: _col0, _col1, _col2
            Statistics: Num rows: 1 Data size: 43 Basic stats: COMPLETE Column stats: NONE
            ListSink

Time taken: 0.263 seconds, Fetched: 34 row(s)

以上两种方法都是查看执行计划,只不过extended会打印语句的抽象语义树。

stage:

(1)一个stage相当于一个MapReduce任务(可以是一个子查询,可以是一个抽样,可以是一个

合并、可以是一个limit)

(2)hive默认每次只执行一个stage,但是没有依赖关系的可以并行执行。

(3)一个hive的hql语句包含一个或者多个stage,多个之间依赖越复杂,表示任务越复杂,执行效率较低。

2.limit的优化

//优化是否开启

hive.limit.optimize.enable=false;

//控制最大的抽样数量

hive.limit.row.max.size=10000;

//抽样的最大文件数量

hive.limit.optimize.limit.file=10;

//fechquery获取最大的行数

hive.limit.optimize.fetch.max=50000;

3.join设置

永远是小表驱动大表

大表标识(/+STREAMTABLE(br)/)

开启map端的join

join的on只支持等值连接,on后的比较的两个字段的数据类型尽量相同

4.local本地模式

hive查询数据依然还是依靠hadoop。

//是否开启本地模式

hive.exec.mode.local.auto=false;

hive.exec.mode.local.auto.inputbytes.max=134217728;

hive.exec.mode.local.auto.input.files.max=4;

5.parallel并行设置

hive没有相互依赖的任务可以并行执行。

//是否设置并行执行

hive.exec.parallel=false;

//并行执行线程数

hive.exec.parallel.thread.number=8;

6.jvm的使用

//jvm rask数量

mapreduce.job.jvm.numtasks=1;

//允许重用的task

set mapred.job.reuse.jvm.num.tasks=1;

7.数据倾斜

由于key的分布不均匀造成的数据向一个方向偏的现象。

数据倾斜原因:

​ 数据本身倾斜

hql语句:

​ join、group by 容易造成

解决数据倾斜:

​ 找到造成数据倾斜的key,

​ 可以单独将这个key提取出来计算,然后再通过union合并进来;

​ 可以将key拼接随机数,然后将其分扫到不同的节点执行;

设置属性:

可去hive配置文档去查看相关解释

//建议开启

hive.map.aggr=true;

hive.optimize.skewjoin=false;

hive.groupby.skewindata=false;

8.job数量

一般是一个查询,子查询,limit等产生一个job(不是所有的这些语句都会产生)。

可以通过语句来控制job。

你可能感兴趣的:(Hive)