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;