Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,能够将sql语句转换为MapReduce任务进行运行 。Hive自己是不能存储数据的,它只是记录数据的一些路径信息,最终全部的操做都转换成MapReduce操做,因此Hive的优化其本质上是对Hadoop的优化。sql
作过大数据开发的,hadoop在处理数据的过程当中有几个特色。数据库
一、数据多不是问题,就怕出现数据倾斜。性能优化
二、对job较多的做业运行效率相对比较低,即便只有几百行数据的表,若是屡次关联汇总,产生几十个job的话,至少也要跑个半小时。这是由于,map reduce的做业初始化的时间自己就比较长。工具
三、对于sum,max,min和count的UDAF来说不怕数据倾斜问题,由于hadoop会在map端对计算出来的结果进行汇总并优化,使得数据倾斜不成问题。oop
四、count(distinct),在数据量大的时候,效率会变得较低,这主要是由于count(distinct)是按照group by来对字段进行分组的,而且按照distinct的字段进行排序,通常是很容易形成数据倾斜的。例如一个大型的购物网站,若是按照男女对访问量进行分组的话,而这个网站一天有20亿的浏览量,按照那女分红两组,由两个reduce来分别进行处理,这样每一个reduce处理10亿数据,显然这样的资源分配是不合理的,效率是比较低下的(就像一堆砖,有10我的能够安排搬这些砖,而后你只安排2个搬搬砖,这样就会形成资源的浪费,下降工做的效率)。性能
在考虑hive性能优化时,把HiveQL当作M/R程序来读会有一种意想不到的收获。也就是从M/R的运行角度来考虑优化性能,从更底层思考如何优化运算性能,而不只仅局限于逻辑代码的替换层面。大数据
RAC(Real Application Cluster)的应用集群就像一辆机动灵活的小货车,响应快。Hadoop就像吞吐量巨大的轮船,启动开销大,若是每次只作小数量的输入输出有点杀鸡用牛刀的感受,会使得Hadoop的特性得不到充分发挥,下降利用率。因此要想用好Hadoop使Hadoop的性能获得充分,最早要作的就是增大每次任务所搭载的数据量。优化
Hadoop的核心能力是parition和sort,在MapReduce的shuffle阶段,会对数据进行打乱->排序->再打乱->再排序,因次这也是优化的根本。网站
Hadoop的做业初始化须要很长的时间,所以当job数量过多时,会致使总体的做业运行时间偏长,从而影响总体的效率,所以这也是在实际生产环境中须要注意的地方,要尽可能使job数量变少。spa
count(distinct)是按照group by来对字段进行分组的,但数据量较大而对应的分区字段较少时,或致使每一个分组的数据量过大,从而形成数据倾斜,所以在数据量较大的时候要谨慎考虑使用count(distinct).
咱们知道在Hadoop中,数据倾斜是形成效率低下的主要缘由,所以在实际环境中,须要尽可能避免数据的倾斜问题。
结论:在对hive进行优化时,应该要注意上述问题,针对上述问题来对Hive进行优化。在作优化的过程当中咱们要作到避实就虚,尽可能使用最少的job 数来执行任务,充分利用空闲 CPU 等各类方法,分解数据倾斜形成的负担。
那么,面对这些问题咱们应该如何处理呢?咱们可以采起哪些有效手段,来对这些问题进行优化呢?咱们能够从一下几个大方面来进行考虑:
一、设计一个好的模型,由于一个好的模型可以作到事半功倍。
二、从数据倾斜问题来考虑,能够采起有效措施解决数据倾斜问题。
三、尽可能减小job的个数,能用一个job完成的,就坚定不用两个job。
四、设置合理的map reduce的task个数,能够有效地提高性能。
五、了解数据的分布,本身动手解决数据的倾斜是个不错的选择
六、对于数据量较大的时候,要慎用count(distinct),由于容易产生数据倾斜。
七、对小文件进行合并,是一种比较行之有效提升效率的方法。
八、在优化时,要注意把握总体最优原则。
针对上述提出的问题,根据hive的特色在下一篇当中将具体介对于hive优化的一些具体细节。