Hive调优

目录

1.fetch抓取( 是否使用MapReduce)

2.本地模式

表的优化:

3.小表join大表(新版本已经优化,无明显差别)

4.大表Join大表

5.MapJoin

6.groupByKey

7.count(distinct)

8.行列过滤(谓词下推)

9.动态分区调整

10.JVM重用

11.并行执行



1.fetch抓取( 是否使用MapReduce)

    有三个参数:[none, minimal, more]

    more,在全局查找、字段查找、limit查找等都不执行mapreduce

    none,所有的都要执行mapreduce

    minimal,仅当在一个分区上select,filter和limit时开启mapreduce

hive.fetch.task.conversion

2.本地模式

    开启本地模式,解决多个小文件输入的时候,分配资源时间超过数据的计算时间

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

表的优化:

3.小表join大表(新版本已经优化,无明显差别)

   将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率 

   set hive.auto.convert.join = false;//关闭mapjoin功能(默认是打开的)

4.大表Join大表

    1.空KEY过滤

    2.空key转换:为空key随机赋值,使得数据随机均匀的去到不同的reducer 

insert overwrite table ntable
select n.* from dtable n full join ctable o on 
case when n.id is null then concat('hive', rand()) else n.id end = o.id;

知识点补充:

1、concat(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

concat_ws(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

2、rand(),rand(int seed)

返回值: double

说明:返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列

3.Case具有两种格式。简单Case函数和Case搜索函数。

简单Case函数格式:                            Case搜索函数:

CASE 列名                                           CASE
WHEN 条件值1 THEN 选项1                WHEN 条件1 THEN 选项1
WHEN 条件值2 THEN 选项2                WHEN 条件2 THEN 选项2
……                                                        ……
ELSE 默认值                                          ELSE 默认值
END                                                        END

5.MapJoin

    MapJoin把小表全部加载到内存中,在map端进行join,避免reducer处理,避免数据倾斜。

set hive.auto.convert.join = true; //默认为true
//默认的大小表阀值(25M)
set hive.mapjoin.smalltable.filesize=25000000;

6.groupByKey

     默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key的数据量过大时会发生数据倾斜,这是可以在map端先部分聚合。

set hive.map.aggr = true;//设置map端聚合
set hive.groupby.mapaggr.checkinterval = 100000;//设置map端进行聚合操作的数目
set hive.groupby.skewindata = true;//设置有数据倾斜的时候进行负载均衡

7.count(distinct)

  使用先group by再count的方式替换count distinct

select count(distinct id) from bigtable;
select count(id) from (select id from bigtable group by id);

8.行列过滤(谓词下推)

     列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

     行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

9.动态分区调整

//开启动态分区
hive.exec.dynamic.partition=true
//设置为nonstrict(允许所有分区字段使用动态分区)
hive.exec.dynamic.partition.mode=nonstrict
//设置每个执行MR的节点最大分区数
hive.exec.max.dynamic.partitions=1000

10.JVM重用

      针对小文件和task比较多的场景,可以开启jvm重用。Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。jvm重用可以使得一个jvm实例在一个job中被重新使用N次。

mapred-site.xml中可修改N的值

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

11.并行执行

      Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。

set hive.exec.parallel=true;              //设置并行执行任务
set hive.exec.parallel.thread.number=8;  //同一个sql允许最大并行度,默认为8。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值