对于hive来说,相信大家都明白,
Hive是基于Hadoop的一个数据仓库工具;它是MapReduce的一个封装,底层就是MapReduce程序;
Hive可以将结构化的数据文件(按照各字段分类的数据)映射成一张虚表,并提供类SQL查询功能。
由于Hive的执行依赖于底层的MapReduce作业,因此对Hadoop作业的优化或者对MapReduce作业的调整是提高Hive性能的基础。
所以我们可以通过一系列的调优方法来使其提高效率。
为什么Hive运行性能低下?
简单来说hive用查询语句查询数据时,会花费大量的时间,尤其是数据量大的时候,低效的查询语句查询不仅耗时长,还会浪费运行资源,有可能查询的时候没有限制分区,导致任务起了好几万个map,导致造成太多的小文件,用过hive的朋友,我想或多或少都有类似的经历:一天下来,没跑几次hive,就到下班时间了。hive在极大数据或者数据不平衡等情况下,经常表现一般,所以很多时候必须进行优化来提高效率。
Hive的性能优化可以从以下几方面入手
首先我们需要知道,在Hadoop分布式计算框架下会衍生哪些问题:
1.数据倾斜
所谓的「数据倾斜」,用通俗的话来讲,就是“一个人累死,其他人闲死”,在
MapReduce程序中,大量的相同key被partition分配到一个分区里,
使这个节点承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,
这样一来也拖累了整体的计算时间,使数据的生产效率十分低下。
2.job数比较多的作业运行效率相对比较低
原因是mapreduce作业初始化的时间是比较长的。
即使只有几百行的表,如果进行多次关联多次汇总,产生十几个jobs,同样会耗时很长。
3.分组太少,不必要的分组,分配reduce不均造成计算压力大
count(distinct)在数据量大的情况下,效率较低,如果是多count(distinct...)效率更低,
因为count(distinct)是按group by字段分组,按distinct字段排序,一般这种分布方式是很倾斜的;
假设需要计算男女的UV,像淘宝一天30亿的PV,
如果按性别分组,分配2个reduce,每个reduce要处理15亿数据。
4.数据倾斜是导致效率大幅降低的主要原因
可以采用多一次 Map/Reduce 的方法, 避免倾斜。
清楚了出现效率低下的主要原因,那么去优化的话也就知道从哪入手了。
调优方案
1.减少处理数据量
列裁剪
Hive 在读数据的时候,可以只读取查询中所需要用到的列,而忽略其它列.
SELECT a,b FROM z WHERE e<10;
在实施此项查询中,z表有 5 列(a,b,c,d,e),Hive 只读取查询逻辑中真实需要 的 3 列 a、b、e,
而忽略列 c,d;这样做节省了读取开销,中间表存储开销和数据整合开销。
分区裁剪
可