优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜。
理解hadoop的核心能力,是hive优化的根本。
观察hadoop处理数据的过程,有几个显著的特征:
1.不怕数据多,就怕数据倾斜。
2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的。map reduce作业初始化的时间是比较长的。
3.对sum,count来说,不存在数据倾斜问题。
4.对count(distinct ),效率较低,数据量一多,准出问题,如果是多count(distinct )效率更低。
优化可以从几个方面着手:
1. 好的模型设计事半功倍。
2. 解决数据倾斜问题。
3. 减少job数。
4. 设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用160个reduce,那是相当的浪费,1个足够)。
5. 自己动手写sql解决数据倾斜问题是个不错的选择。set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化总是漠视业务,习惯性提供通用的解决方法。 Etl开发人员更了解业务,更了解数据,所以通过业务逻辑解决倾斜的方法往往更精确,更有效。
6. 对count(distinct)采取漠视的方法,尤其数据大的时候很容易产生倾斜问题,不抱侥幸心理。自己动手,丰衣足食。
7. 对小文件进行合并,是行至有效的提高调度效率的方法,假如我们的作业设置合理的文件数,对云梯的整体调度效率也会产生积极的影响。
8. 优化时把握整体,单个作业最优不如整体最优。
---------------------
作者:preterhuman_peak
原文:https://blog.csdn.net/preterhuman_peak/article/details/40649213
以下部分是自己总结的,没有上面这个前辈总结的这么好
关于hive的优化可以分为以下的六个优化方面
1.本地化
2.IO优化
3.数据倾斜
4.shuffle
5.执行模式
6.map/reduce精细控制
好的,接下来依次了解一下他们的优化内容
(1)性能优化---本地化
可以开启本地执行模式,适用于IO和计算都比较小的任务
(2)性能优化---IO优化
主要是关于文件的切分性和小文件是否过多,以及mapreduce过程中的压缩问题
(3)性能优化---数据倾斜
在map端开启一个combiner,通过减少网络传输来减少数据倾斜的发生
还有一个就是万能贴,有时有用有时没用,看数据的倾斜程度和原因
(4)性能优化---shuffle
(5)性能优化---执行模式
(6)性能优化---map/reduce精细控制