一.调优概述
Hive作为大数据领域常用的数据仓库组件,在平时设计和查询时要特别注意效率。影响Hive效率的几 乎从不是数据量过大,而是数据倾斜、数据冗余、Job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含Hive的建表设计方面,对HiveHQL语句本身的优化,也包含Hive配置参数和底层引擎MapReduce方面的调整。
所地这次调优主要分为以下四个方面展开:
1、 Hive的建表设计层面
2、 HQL语法和运行参数层面
3、 Hive架构层面
4、 Hive数据倾斜
总之,Hive调优的作用:在保证业务结果不变的前提下,降低资源的使用量,减少任务的执行时间。
二.调优须知
- 对于大数据计算引擎来说:数据量大不是问题,数据倾斜是个问题。
- Hive的复杂HQL底层会转换成多个MapReduce Job并行或者串行执行,Job数比较多的作业运行效率相对比较低,比如即使只有几百行数据的表,如果多次关联多次汇总,产生十几个Job,耗时很长。 原因MapReduce作业初始化的时间是比较长的。
- 在进行Hive大数据分析时,常见的聚合操作比如sum, count, max, min,
UDAF等,不怕数据倾斜问题,MapReduce在Mappe阶段的预聚合操作,使数据倾斜不成问题。 - 好的建表设计,模型设计事半功倍。
- 设置合理的MapReduce的Task并行度,能有效剧性能。(比如,10w数据量级计算,用100个reduceTask,那是相当的浪费,1个足够,但是如果是亿级的数据量,那么1个Task又会很少,至少保证1个tast处理10w+即可)
- 数据量较大的情况下,慎用count(distinct), group by容易产生倾斜问题。
- 对小文件进行合并,是行之有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对任 务的整体调度效率也会产生积极的正向影响
- 优化时把握整体,单个作业最优不如整体最优。
3.调优具体细节
3.1. Hive建表设计层面
Hive的建表设计层面调优,主要以建表的类型, 文件存储格式,压缩格式等多方面进行参考。
1.利用分区表优化
分区表是在某一个或者几个维度上对瞄进行分类存储,一个分区对应一个目录。如果筛选条件里有分区字段,那么Hive只需要遍历对应分区目录下的文件即可,不需要遍历全局数据,使得处理的数据量 大大减少,从而提高新旬效率。
也就是说:当一个Hive表的查询大多数情况下,会根据某一个字段逬行筛选时,那么非常适合创建为 分区表,该字段即为分区字段。
seiectl: seiect .... where country = "china"
seiect2: seiect .... where country = "chinaH
seiect3: seiect .... where country = "china"
select4: seiect .... where country = "china"
分门别类:这个city字段的每个值,就单独形成为一个分区。其实每个分区就对应带HDFS的一个目录 在创建表时通过启用partitioned by实现,用来partition的维度并不是实际数据的某一列,具体分 区的标志是由插入内容时给定的。
当要查询某一分区的内容时可以采用where语句,形似where tablename. partition_column = a 来实现。
1.创建含分区的表:
create TABLE page_vi ew(vi ewTime INT, useri d BIGINT,
page_url string, referrer_url string,
ip string comment