大数据性能优化之Hive优化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hive性能优化

1.概述

本人在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。

2.介绍

首先,我们来看看hadoop的计算框架特性,在此特性下会衍生哪些问题?

•数据量大不是问题,数据倾斜是个问题。

•jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是map reduce作业初始化的时间是比较长的。

•sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map 端的汇总合并优化,使数据倾斜不成问题。

•count(distinct ),在数据量大的情况下,效率较低,如果是多count(distinct )效率更低,因为count(distinct)是按group by 字段分组,按distinct字段排序,一般这种分布方式是很倾斜的。举个例子:比如男uv,女uv,像淘宝一天30亿的pv,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。

面对这些问题,我们能有哪些有效的优化手段呢?下面列出一些在工作有效可行的优化手段:

•好的模型设计事半功倍。

•解决数据倾斜问题。

•减少job数。

•设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用160个reduce,那是相当的浪费,1个足够)。•了解数据分布,自己动手解决数据倾斜问题是个不错的选择。

set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题。

•数据量较大的情况下,慎用count(distinct),count(distinct)容易产生倾斜问题。

•对小文件进行合并,是行至有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对云梯的整体调度效率也会产生积极的正向影响。

•优化时把握整体,单个作业最优不如整体最优。

而接下来,我们心中应该会有一些疑问,影响性能的根源是什么?

3.性能低下的根源

hive性能优化时,把HiveQL当做M/R程序来读,即从M/R的运行角度来考虑优化性能,从更底层思考如何优化运算性能,而不仅仅局限于逻辑代码的替换层面。

RAC(Real Application Cluster)真正应用集群就像一辆机动灵活的小货车,响应快;Hadoop就像吞吐量巨大的轮船,启动开销大,如果每次只做小数量的输入输出,利用率将会很低。所以用好Hadoop的首要任务是增大每次任务所搭载的数据量。

Hadoop的核心能力是parition和sort,因而这也是优化的根本。

观察Hadoop处理数据的过程,有几个显著的特征:

•数据的大规模并不是负载重点,造成运行压力过大是因为运行数据的倾斜。

•jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联对此汇总,产生几十个jobs,将会需要30分钟以上的时间且大部分时间被用于作业分配,初始化和数据输出。M/R作业初始化的时间是比较耗时间资源的一个部分。

•在使用SUM,COUNT,MAX,MIN等UDAF函数时,不怕数据倾斜问题,Hadoop在Map端的汇总合并优化过,使数据倾斜不成问题。•COUNT(DISTINCT)在数据量大的情况下,效率较低,如果多COUNT(DISTINCT)效率更低,因为COUNT(DISTINCT)是按GROUP BY字段分组,按DISTINCT字段排序,一般这种分布式方式是很倾斜的;比如:

男UV,女UV,淘宝一天30亿的PV,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。

•数据倾斜是导致效率大幅降低的主要原因,可以采用多一次Map/Reduce 的方法,避免倾斜。

最后得出的结论是:避实就虚,用job 数的增加,输入量的增加,占用更多存储空间,充分利用空闲CPU 等各种方法,分解数据倾斜造成的负担。

4.配置角度优化

我们知道了性能低下的根源,同样,我们也可以从Hive的配置解读去优化。Hive系统内部已针对不同的查询预设定了优化方法,用户可以通过调整配置进行控制,以下举例介绍部分优化的策略以及优化控制选项。

4.1列裁剪

Hive 在读数据的时候,可以只读取查询中所需要用到的列,而忽略其它列。例如,若有以下查询:

SELECT a,b FROM q WHERE e<10;

在实施此项查询中,Q 表有5 列(a,b,c,d,e),Hive 只读取查询逻辑中真实需要的3 列a、b、e,而忽略列c,d;这样做节省了读取开销,中间表存储开销和数据整合开销。

裁剪所对应的参数项为:hive.optimize.cp=true(默认值为真)

4.2分区裁剪

可以在查询的过程中减少不必要的分区。例如,若有以下查询:

SELECT*FROM (SELECTT a1,COUNT(1) FROM T GROUPBY a1) subq WHERE subq.prtn=100; #(多余分区)SELECT*FROM T1 JOIN (SELECT*FROM T2) subq ON (T1.a1=subq.a2) WHERE subq.prtn=100;

查询语句若将“subq.prtn=100”条件放入子查询中更为高效,可以减少读入的分区数目。Hive 自动执行这种裁剪优化。

分区参数为:hive.optimize.pruner=true(默认值为真)

4.3JOIN操作

在编写带有join 操作的代码语句时,应该将条目少的表/子查询放在Join 操作符的左边。因为在Reduce 阶段,位于Join 操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少OOM (out of memory)即内存溢出。所以对于同一个key 来说,对应的value 值小的放前,大的放后,这便是“小表放前”原则。若一条语句中有多个Join,依据Join 的条件相同与否,有不同的处理方法。

4.3.1JOIN原则

在使用写有Join 操作的查询语句时有一条原则:应该将条目少的表/子查询放在Join 操作符的左边。原因是在Join 操作的Reduce 阶段,

相关文档
最新文档