hive优化

1. 查看sql执行计划

explain [extended] sql
explain : 只解析sql成计划
explain extended:除咯有计划,还有抽象语义树。
  • e.g
hive (yul)> explain select * from dept;
OK
STAGE DEPENDENCIES:
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        TableScan
          alias: dept
          Statistics: Num rows: 1 Data size: 82 Basic stats: COMPLETE Column stats: NONE
          Select Operator
            expressions: deptno (type: int), dname (type: string), loc (type: string)
            outputColumnNames: _col0, _col1, _col2
            Statistics: Num rows: 1 Data size: 82 Basic stats: COMPLETE Column stats: NONE
            ListSink
  • stage:
一个stage相当于一个mapreduce任务(可以是一个子查询、可以是一个抽样、可以是一个合并、可以是一个limit),

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

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

2. limit的限制:

hive.limit.optimize.enable=false; //limit的优化  建议设置true 
hive.limit.row.max.size=100000; //允许扫描的最大行数
hive.limit.optimize.limit.file=10;  //允许扫描的最大文件数
hive.limit.optimize.fetch.max=50000;

3. join设置:

永远是小表驱动大表
大表标识(/*+STREAMTABLE(bt)*/)
开启map端的join(默认开启)
..convert..
..smalltable.filesize
join的on只支持等值连接

4. 本地模式

hive查询数据任然还是依靠hadoop,hadoop又有单机、分布式、HA的方式。在单个jvm中运行
hive.exec.mode.local.auto=false; 建议开启
hive.exec.mode.local.auto.inputbytes.max=134217728;  //执行sql的所有表的总大小不超过128m
hive.exec.mode.local.auto.input.files.max=4;    //文件数不操作4个

5. 并行运行

hive没有相互依赖的任务可以并行执行。
hive.exec.parallel=false;   //是否开启并行,建议开启  
hive.exec.parallel.thread.number=8;     //并行数量

6. strict严格模式:

严格模式hive将会阻止5类查询。
1.笛卡儿积查询
2.分区不带过滤字段
3.order by 不带limit
4.string和bigint比较
5.double和bigint比较不允许

7.调整mapper或者reducer的个数:

set mapred.max.split.size=256000000; //  256M
set dfs.block.size=;
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;   //小文件多,设置该属性可以合并

直接设置mapper的个数。(mapred-site.xml)

手动设置mapper的个数:????

reduce的个数的设置:
直接手动设置。
set hive.exec.reducers.bytes.per.reducer=256000000; //256M
set hive.exec.reducers.max=1009;
set mapreduce.job.reduces=-1;

set mapred.reduce.tasks=;   //设置task的个数
hive.exec.reducers.max=1009;    //设置reducer的最大个数

8. JVM的重用:

set mapreduce.job.jvm.numtasks=1;   //一个jvm允许有几个task
set mapred.job.reuse.jvm.num.tasks=1;   //一个jvm允许有多少个task重用

9. 数据倾斜

由于key的分布不均匀造成的数据向一个方向偏的现象。
卡在某个stage一直不运行。
数据倾斜原因:
数据本身倾斜
hql语句:
join 容易造成
group by也容易造成


怎么解决倾斜:
找到造成倾斜的原因,找到造成的倾斜的key,
可以单独将这个key提取出来计算,然后再通过union合并进来;
可以将key拼接随机数,然后将其分散到不同的节点执行。
设置属性:
hive.map.aggr=true;
hive.optimize.skewjoin=false;   //是否开启数据倾斜优化,建议开启
hive.groupby.skewindata=false;

10. job数量:

一般是一个查询、子查询、limit、连接等、order by等产生一个job。可以通过语句来控制job
select
a7.*
from u4 a7
where a7.id in(
select id 
from u1
where id > 1
limit 1
)
;
改为(减少job数量):
select
a7.*
from u4 a7
left join u1 a9
on a7.id = a9.id
where a9.id > 1
;

11. 多个mr中group by放到单个reducer中:

hive.multigroupby.singlereducer=true;

12. 创建分区

转载于:https://my.oschina.net/yulang/blog/2248223

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值