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,多个之间依赖越复杂,表示任务越复杂,执行效率较低。
//优化是否开启
hive.limit.optimize.enable=false;
//控制最大的抽样数量
hive.limit.row.max.size=10000;
//抽样的最大文件数量
hive.limit.optimize.limit.file=10;
//fechquery获取最大的行数
hive.limit.optimize.fetch.max=50000;
永远是小表驱动大表
大表标识(/+STREAMTABLE(br)/)
开启map端的join
join的on只支持等值连接,on后的比较的两个字段的数据类型尽量相同
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;
hive没有相互依赖的任务可以并行执行。
//是否设置并行执行
hive.exec.parallel=false;
//并行执行线程数
hive.exec.parallel.thread.number=8;
//jvm rask数量
mapreduce.job.jvm.numtasks=1;
//允许重用的task
set mapred.job.reuse.jvm.num.tasks=1;
由于key的分布不均匀造成的数据向一个方向偏的现象。
数据倾斜原因:
数据本身倾斜
hql语句:
join、group by 容易造成
解决数据倾斜:
找到造成数据倾斜的key,
可以单独将这个key提取出来计算,然后再通过union合并进来;
可以将key拼接随机数,然后将其分扫到不同的节点执行;
设置属性:
可去hive配置文档去查看相关解释
//建议开启
hive.map.aggr=true;
hive.optimize.skewjoin=false;
hive.groupby.skewindata=false;
一般是一个查询,子查询,limit等产生一个job(不是所有的这些语句都会产生)。
可以通过语句来控制job。