Hive系列(三)—— 性能优化及数据倾斜

在Hive使用中,数据倾斜以及解决方案,是老生常谈的问题,一直没有时间去全面的了解;最近花了一段时间,总结了hive性能优化,尤其是数据倾斜的优化如下。希望能对Hive感兴趣/想了解的同学有所帮助。 同时也希望有发现内容不正确或者有疑问的地方,望指明,一起探讨,学习,进步。

性能低下的根源

一句话总结Hive

Hive 是由 Facebook 实现并开源的、基于 Hadoop 的一个数据仓库工具。它可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能;其底层数据是存储在 HDFS 上,Hive的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。

性能低下的根源

正如上所说,Hive的本质是将 SQL 语句转换为 MapReduce 任务运行,底层数据是存储在 HDFS 上;那么Hive性能低下的原因就是为 MapReduce,尤其是shuffle阶段的parition和sort 大量计算引起的计算耗时和 HDFS存储Hive数据的空间不合理。关于MapReduce,可以参考MapReduce 心脏命脉;HDFS,可以参考HDFS体系结构,了解它们的原理。

查看执行性能 EXPLAIN

基本语法:

EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query

例如:

explain select userid,avg(paymoney) from consume group by userid

结果:

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: consume
            Statistics: Num rows: 29110 Data size: 349321 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: userid (type: bigint), paymoney (type: float)
              outputColumnNames: userid, paymoney
              Statistics: Num rows: 29110 Data size: 349321 Basic stats: COMPLETE Column stats: NONE
              Group By Operator
                aggregations: avg(paymoney)
                keys: userid (type: bigint)
                mode: hash
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 29110 Data size: 349321 Basic stats: COMPLETE Column stats: NONE
                Reduce Output Operator
                  key expressions: _col0 (type: bigint)
                  sort order: +
                  Map-reduce partition columns: _col0 (type: bigint)
                  Statistics: Num rows: 29110 Data size: 349321 Basic stats: COMPLETE Column stats: NONE
                  value expressions: _col1 (type: struct<count:bigint,sum:double,input:float>)
      Reduce Operator Tree:
        Group By Operator
          aggregations: avg(VALUE._col0)
          keys: KEY._col0 (type: bigint)
          mode: mergepartial
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 14555 Data size: 174660 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: false
            Statistics: Num rows: 14555 Data size: 174660 Basic stats: COMPLETE Column stats: NONE
            table:
                input format: org.apache.hadoop.mapred.TextInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

性能优化

在这里插入图片描述

开启Fetch 抓取(默认已开启)

Fetch 抓取是指, Hive 中对某些情况的查询可以不必使用 MapReduce 计算。例如: SELECT * FROM employees;在这种情况下, Hive 可以简单地读取 employee对应的存储目录下的文件, 然后输出查询结果到控制台。

hive-default.xml.template 文件中 hive.fetch.task.conversion默认是 more(老版本hive 0.11.0 默认是 minimal), 在全局查找、 字段查找、limit 查找等都不走 mapreduce,把 hive.fetch.task.conversion 设置成 none, 然后执行查询语句, 全局查找、 字段查找、limit 查找等都会执行mapreduce 程序。

如下图所示:很明显的可以看出,开启和关闭Fetch 抓取时查询时间差距达几百倍(红框所示),并且关闭Fetch 抓取时查询启动了MapReduce工作(绿框所示)。

在这里插入图片描述

本地模式(默认未开启)

大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。 不过, 有时 Hive 的输入数据量是非常小的。 在这种情况下, 为查询触发执行任务时消耗可能会比实际 job 的执行时间要多的多。对于大多数这种情况, Hive可以通过本地模式在单台机器上处理所有的任务。 对于小数据集, 执行时间可以明显被缩短。

用户可以通过设置 hive.exec.mode.local.auto 的值为 true, 来让 Hive 在适当的时候自动启动这个优化。

 //开启本地 mr
set hive.exec.mode.local.auto=true;

//设置 local mr 的最大输入数据量, 当输入数据量小于这个值时采用 local mr 的方式, 默认为 134217728, 即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置 local mr 的最大输入文件个数, 当输入文件个数小于这个值时采用local mr 的方式, 默认为 4
set hive.exec.mode.local.auto.input.files.max=8;

开启和关闭本地模式对比如下:

#1.开启本地模式, 并执行查询语句
hive (default)> set hive.exec.mode.local.auto=true;
hive (default)> select * from emp cluster by deptno;

Time taken: 5.788 seconds, Fetched: 14 row(s)

#2.关闭本地模式, 并执行查询语句
hive (default)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值