Hive性能调优工具

简介: HQL提供了两个查看查询性能的工具:explain与analyze,除此之外Hive的日志也提供了非常详细的信息,方便查看执行性能和报错排查。

HQL提供了两个查看查询性能的工具:explain与analyze,除此之外Hive的日志也提供了非常详细的信息,方便查看执行性能和报错排查。

工具一:explain

explain语句是查看执行计划经常使用的一个工具,可以使用该语句分析查询执行计划,具体使用语法如下:

EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION] hql_query

其中,关键字的含义:
• FORMATTED:对执行计划进行格式化,返回JSON格式的执行计划
• EXTENDED:提供一些额外的信息,比如文件的路径信息
• DEPENDENCY:以JSON格式返回查询所依赖的表和分区的列表,从Hive0.10开始使用,如下图
image.png
• AUTHORIZATION:列出需要被授权的条目,包括输入与输出,从Hive0.14开始使用,如下图
image.png

一个典型的查询执行计划主要包括三部分,具体如下:
• Abstract Syntax Tree (AST):抽象语法树,Hive使用一个称之为antlr的解析生成器,可以自动地将HQL生成为抽象语法树
• Stage Dependencies:会列出运行查询所有的依赖以及stage的数量
• Stage Plans:包含了非常重要的信息,比如运行作业时的operator 和sort orders
比如:

EXPLAIN
SELECT cc_call_center_id,
       count(*)
FROM tpcds_bin_partitioned_parquet_30.call_center
WHERE cc_call_center_sk = 2
GROUP BY cc_call_center_id
LIMIT 2;

查看执行计划:

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: call_center
            filterExpr: (cc_call_center_sk = 2) (type: boolean)
            Statistics: Num rows: 6 Data size: 186 Basic stats: COMPLETE Column stats: NONE
            Filter Operator
              predicate: (cc_call_center_sk = 2) (type: boolean)
              Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: cc_call_center_id (type: string)
                outputColumnNames: cc_call_center_id
                Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE
                Group By Operator
                  aggregations: count()
                  keys: cc_call_center_id (type: string)
                  mode: hash
                  outputColumnNames: _col0, _col1
                  Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE Column stats: NONE
                  Reduce Output Operator
                    key expressions: _col0 (type: string)
                    sort order: +
                    Map-reduce partition columns: _col0 (type: string)
                    Statistics: Num rows: 3 Data size: 93 Basic stats: COMPLETE 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: 31 Basic stats: COMPLETE Column stats: NONE
          Limit
            Number of rows: 2
            Statistics: Num rows: 1 Data size: 31 Basic stats: COMPLETE Column stats: NONE
            File Output Operator
              compressed: false
              Statistics: Num rows: 1 Data size: 31 Basic stats: COMPLETE 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: 2
      Processor Tree:
        ListSink

其中包含了STAGE DEPENDENCIES、STAGE PLANS、Map Operator Tree和Reduce Operator Tree就是抽象语法树部分,STAGE DEPENDENCIES包含两个stage,其中Stage-1是根stage,Stage-0依赖与Stage-1,STAGE PLANS中Stage-1用于计算,Stage-0只是用于拉取数据。

工具二:analyze

analyze语句可以收集一些详细的统计信息,比如表的行数、文件数、数据的大小等信息。这些统计信息作为元数据存储在hive的元数据库中。Hive支持表、分区和列级别的统计(与Impala类似),这些信息作为Hive基于成本优化策略(Cost-Based Optimizer (CBO))的输入,该优化器的主要作用是选择耗费最小系统资源的查询计划。其实,在Hive3.2.0版本中,可以自动收集这些统计信息,当然也可以通过analyze语句进行手动统计表、分区或者字段的信息。具体的使用方式如下:
1.收集表的统计信息(非分区表),当指定NOSCAN关键字时,会忽略扫描文件内容,仅仅统计文件的数量与大小,速度会比较快
ANALYZE TABLE 表名 COMPUTE STATISTICS;
ANALYZE TABLE 表名 COMPUTE STATISTICS NOSCAN;
2.收集分区表的统计信息
ANALYZE TABLE 表名 PARTITION(分区1,分区2) COMPUTE STATISTICS;
收集指定分区信息
ANALYZE TABLE 表名 PARTITION(分区1='xxx',分区2='yyy') COMPUTE STATISTICS;
3.收集表的某个字段的统计信息
ANALYZE TABLE 表名 COMPUTE STATISTICS FOR COLUMNS 字段名 ;
可以通过设置:SET hive.stats.autogather=true,进行自动收集统计信息,对于INSERT OVERWRITE/INTO操作的表或者分区,可以自动收集统计信息。值得注意的是,LOAD操作不能够自动收集统计信息
一旦这些统计信息收集完毕,可以通过DESCRIBE EXTENDED/FORMATTED语句查询统计信息,具体使用如下:
1、查看一个分区的信息

DESCRIBE FORMATTED 表名 PARTITION(分区1='xxx',分区2='yyy');

2、查看一张表的信息

DESCRIBE FORMATTED 表名;

3、查看表中的字段信息

DESCRIBE FORMATTED 表名.列名;

了解更多大数据运维服务

目录
相关文章
|
3月前
|
SQL 大数据 HIVE
Hive 任务调优实践总结
Hive 任务调优实践总结
47 0
|
3月前
|
SQL 分布式计算 关系型数据库
【数据仓库与联机分析处理】数据仓库工具Hive
【数据仓库与联机分析处理】数据仓库工具Hive
82 6
|
3月前
|
SQL 分布式计算 Java
bigdata-24-Hive调优
bigdata-24-Hive调优
23 0
|
SQL 存储 JSON
Hive学习---7、企业级调优(二)
Hive学习---7、企业级调优(二)
|
SQL 缓存 JSON
Hive学习---7、企业级调优(一)
Hive学习---7、企业级调优(一)
|
SQL 存储 负载均衡
工作常用之Hive 调优【四】HQL 语法优化
列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。当列很多或者数据量很大时,如果 select * 或者不指定分区,全列扫描和全表扫描效率都很低。
235 0
工作常用之Hive 调优【四】HQL 语法优化
|
存储 SQL 分布式计算
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化
在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多,所以我们需要把常常用在 WHERE 语句中的字段指定为表的分区字段。
323 0
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化
|
SQL 关系型数据库 MySQL
hive数据库操作与sqoop工具的使用
hive数据库操作与sqoop工具的使用
|
SQL 分布式计算 负载均衡
如何从语法与参数层面对Hive进行调优
作为企业Hadoop应用的核心产品,Hive承载着FaceBook、淘宝等大佬95%以上的离线统计,很多企业里的离线统计甚至全由Hive完成,如电商、金融等行业。Hive在企业云计算平台发挥的作用和影响愈来愈大。因此,如何优化提速已经显得至关重要。
|
SQL HIVE C++
Hive - Count && Sum 使用与性能对比
使用 hive 计数时常使用 Count 和 Sum 两个函数进行统计,下面看看二者的使用方法。
609 0
Hive - Count && Sum 使用与性能对比