目录
1.查询性能的实用工具
HQL提供了EXPLAIN和ANALYZE命令语句,可以用来查看某个查询的性能。另外,Hive的日志包含了性能方面和线上故障排查的详细信息,可以结合在一起使用,进行性能调优。
1.1EXPLAIN语句
1.1.1EXPLAIN语法
Hive提供了EXPALIN语句,可以用来查看执行某个查询的执行计划(execution plan)。可以使用该命令进行性能分析。
基本的语法为:
EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION] hql_query
其中可选的四个关键字的具体含义为:
FORMATTED:返回JSON格式的查询计划
EXTENDED:返回更加详细的额外信息,比如文件的路径名
DEPENDENCY:返回JSON格式的输出,该输出包括查询所依赖的表的信息和分区的信息,从Hive v0.10.0开始,才添加的功能。比如
{"input_tables":[{"tablename":"default@music2","tabletype":"MANAGED_TABLE"}],"input_partitions":[]}
AUTHORIZATION:返回所有需要授权的条目,包括运行查询的输入和输出,如果授权失败,还会列出授权失败的信息,从从Hive v0.14.0开始,才添加的功能,比如:
INPUTS:
default@music2
OUTPUTS:
hdfs://kms-1.apache.com:8020/tmp/hive/kms/df84775a-f091-46da-9a76-5721ebb12566/hive_2019-02-28_10-25-56_312_8620977237876835177-1/-mr-10001
CURRENT_USER:
kms
OPERATION:
QUERY
1.1.2查询计划
一个典型的查询计划包括下面三部分:
(1)抽象语法树(AST,Abstract Syntax Tree),Hive使用一个叫做ANTLR的解析生成器自动生成HQL的语法树。
(2)Stage依赖(Stage Dependencies): 列出所有的依赖以及stage的个数
(3)Stage 计划(Stage Plans): 包含了运行job的重要的信息,比如Map/Reduce操作和sort排序
1.1.3例子
hive (default)> explain select name ,count(1) from music2 where date_time="2019-2-16" group by name limit 3;
结果输出:
OK
Explain
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: music2
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
Filter Operator
predicate: (date_time = '2019-2-16') (type: boolean)
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
Select Operator
expressions: name (type: string)
outputColumnNames: _col0
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
Group By Operator
aggregations: count(1)
keys: _col0 (type: string)
mode: hash
outputColumnNames: _col0, _col1
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
Reduce Output Operator
key expressions: _col0 (type: string)
sort order: +
Map-reduce partition columns: _col0 (type: string)
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
TopN Hash Memory Usage: 0.1
value expressions: _col1 (type: bigint)
Reduce Operator Tree:
Group By Operator
aggregations: count(VALUE._col0)
keys: KEY._col0 (type: string)
mode: mergepartial
outputColumnNames: _col0, _col1
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
Limit
Number of rows: 3
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE
table:
input format: org.apache.hadoop.mapred.SequenceFileInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: 3
Processor Tree:
ListSink
Time taken: 1.188 seconds, Fetched: 55 row(s)
1.2 ANALYZE语句
Hive的统计信息是能够描述更多细节的数据集合,比如行数、文件数、原始数据大小等。统计信息是元数据,保存在metastore数据库中。Hive支持统计表、分区、列的信息,这些统计信息作为Hive基于成本的优化器(Cost-Based Optimizer)的输入,该优化器能够挑选出消耗最低系统资源的执行计划。在Hive v3之后支持自定收集统计信息,也可以使用ANALYZE语句收集表、分区、列的统计信息。对于当hive.stats.autogather=true时,会自动收集表的统计信息,但是,对于一个新表或者分区,只有在执行INSERT OVERWRITE/INTO语句时,才会自动收集统计信息,执行LOAD操作时,不会自动收集统计信息。
1.2.1 ANALYZE语法
ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)] -- (Note: Fully support q