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

本文将介绍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_开头。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342