hive优化

成长之路 2018-10-18

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. 创建分区

hive优化

相关推荐