美文网首页
hive调优实战系列文章-hive调优和问题排查思路

hive调优实战系列文章-hive调优和问题排查思路

作者: 数据的艺术2 | 来源:发表于2020-06-22 22:42 被阅读0次

本文将介绍Hive调优的整体过程,以及本人对Hive调优过程的一些思考,包括Hive调优的一般步骤,和调优方法。

1,Hive一般优化方法

1,查看HiveSQL执行计划

Hive SQL的执行计划描绘SQL实际执行的整体轮廓,通过执行计划能了解SQL程序在转换成相应的计算引擎的执行逻辑,通过执行逻辑就能够更好的掌握程序出现的性能瓶颈点在哪,从而能够实现更有针对性的优化。

我们通过explain关键字查看下面语句的执行计划:

explain select age,count(1) from student_txt group by age;

MR引擎的执行计划如下:

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: student_txt
            Statistics: Num rows: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: age (type: string)
              outputColumnNames: age
              Statistics: Num rows: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
              Group By Operator
                aggregations: count(1)
                keys: age (type: string)
                mode: hash
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 12200000 Data size: 1220000000 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: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
                  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: 6100000 Data size: 610000000 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: false
            Statistics: Num rows: 6100000 Data size: 610000000 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: -1
      Processor Tree:
        ListSink

Spark执行引擎的执行计划如下:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Spark
      Edges:
        Reducer 2 <- Map 1 (GROUP, 37)
      DagName: root_20200622221933_43f5ca02-fcc1-4a5e-9200-f244cc02d015:1
      Vertices:
        Map 1
            Map Operator Tree:
                TableScan
                  alias: student_txt
                  Statistics: Num rows: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
                  Select Operator
                    expressions: age (type: string)
                    outputColumnNames: age
                    Statistics: Num rows: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
                    Group By Operator
                      aggregations: count(1)
                      keys: age (type: string)
                      mode: hash
                      outputColumnNames: _col0, _col1
                      Statistics: Num rows: 12200000 Data size: 1220000000 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: 12200000 Data size: 1220000000 Basic stats: COMPLETE Column stats: NONE
                        value expressions: _col1 (type: bigint)
        Reducer 2
            Execution mode: vectorized
            Reduce Operator Tree:
              Group By Operator
                aggregations: count(VALUE._col0)
                keys: KEY._col0 (type: string)
                mode: mergepartial
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 6100000 Data size: 610000000 Basic stats: COMPLETE Column stats: NONE
                File Output Operator
                  compressed: false
                  Statistics: Num rows: 6100000 Data size: 610000000 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: -1
      Processor Tree:
        ListSink

对比mr执行引擎和spark执行引擎,两者的执行计划基本一致。

扩展:

修改以下配置可以切换hive执行引擎:

set hive.execution.engine=spark; //切换spark执行引擎
set hive.execution.engine=mr; //切换map-reduce执行引擎

2 使用yarn提供的日志

我们通过yarn日志可以知道HiveSQL所有阶段的运行信息,查看日志的连接,可以在每个作业执行后,在控制台打印的信息中心找到。


yarn日志链接.png

如图所示,Tracking URL就是我们需要的日志链接,复制链接在浏览器打开,将得到如下图所示页面:


yarn日志界面.png
此页面反映了SQL运行的整体情况,单击左边Job下的Counters链接,可以看到熟悉的信息,
yarn_job详细信息.png

这个页面描述里MapReduce作业在各个阶段的量化数据,例如,Map input records 表示Map阶段输入的数据条数,Map output bytes 表示Map阶段输出数据的字节数,Map output records 表示Map阶段 输出记录数,通过这些关键词,可以看到一个作业在运行中具体的,可以量化的数据描述。

3,hive调优的原则

  • 理透需求,这是优化的根本
  • 把我数据全链路,这是优化的脉络
  • 坚持代码简介,这让优化更简单
  • 没有瓶颈时谈优化,是自寻烦恼

4,Hive程序相关规范

1,开发规范

  • 单条SQL长度不宜超过一屏
  • SQL子查询嵌套不宜超过3层
  • 避免SQL代码的复制粘贴,如果有多处逻辑一致的代码,可以将执行结果存储到临时表里。
  • 尽可能使用SQL自带的高级命令。
  • 使用set命令进行配置属性设置时,要写好注释。
    代码里不允许对表/分区/列的DDL语句,除了新增和删除分区。
  • 保持一个查询语句所处理的表类型单一。
  • 关注NULL值 的数据处理。
  • SQL表连接的条件列和查询的过滤的列最好要有分区列和分桶列。
  • 存在多层嵌套,内层嵌套表的过滤条件不要写到外层,例如:
select a.* 
from a
left join b
on a.id=b.id
where a.no=1

应该写为:

select a.*
from (select * from a where a.no=1) a
left join b
on a.id=b.id

2,设计规范

  • 表结构要有注释。
  • 列等属性字段需要有注释。
  • 不要使用索引。索引在HIVE3.0后废除,使用物化视图或数据存储采用ORC格式可以代替索引功能。
  • 创建内部表不允许指定数据存储路径。
  • 创建非接口表,只允许使用ORC或者Parquet,同一个库内只运行使用一种数据存储格式。
  • Hive适合处理宽表,适当冗余数据有助于Hive的处理性能。
  • 表的文件块大小要与HDFS的数据块大小尽量相等。
  • 善用分区分桶表。

3,命名规范

  • 库/表/字段命名要自成一套体系:
  • 表以tb_开头。
  • 临时表以tmp_开头。
  • 视图以v_开头。
  • 自定义函数以udf_开头。
  • 原始数据表所在的库以db_org_开头,明细数据所在库以db_detail_开头,数据仓库以db_dw_开头。

相关文章

  • hive调优实战系列文章-hive调优和问题排查思路

    本文将介绍Hive调优的整体过程,以及本人对Hive调优过程的一些思考,包括Hive调优的一般步骤,和调优方法。 ...

  • Hive 调优总结,让 Hive 调优想法不再碎片化

    通过阅读比较多的 Hive 调优材料,并根据自己的实践,总结 Hive 调优如下,让 Hive 调优想法不再凌乱、...

  • Hive调优

    宏观调优思路 1.资源充足加内存 2.数据接入慢调优接入工具Sqoop/Datax 3.Hive参数调优 4.sq...

  • Hive ETL 优化(参数篇)

    Hive 调优-参数篇 <** 工作中常用的 hive 参数调优,整理如下。 原则: 最少数据 最少字段 最少Jo...

  • hive调优实战系列文章-综述

    谈到一个大数据组件的调优,必然是一项具有挑战性的综合性的工作,必须是多门技术的结合。下面几周我会根据下面的调优思维...

  • hive调优实战系列文章-hive数据准备

    本文主要讲解利用python 生成hive数据,主要包括python数据生成,数据上传hdfs,hive建库建表,...

  • hive调优

    1,参数调优 hive.map.aggr = true hive.groupby.skewindata =tr...

  • Hive调优

    1.使用explain 和 explain extended 2.限制调整 limit 在使用Limit 时只输...

  • Hive 调优

    列出调优参数列表 具体可参考https://www.cnblogs.com/xd502djj/p/3799432....

  • Hive调优

    Fetch抓取(Hive可以避免进行MapReduce)Hive中对某些情况的查询可以不必使用MapReduce计...

网友评论

      本文标题:hive调优实战系列文章-hive调优和问题排查思路

      本文链接:https://www.haomeiwen.com/subject/egbffktx.html