1、列裁剪:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
2、分区裁剪:先过滤在join,或者在on后带上过滤条件(最好先过滤在join)
3、尽量把count distinct 转成group by。(数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成)
4、Map端Join;但是要注意将小表放在前面:(参数hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M。0.7版本之后,默认自动会转换Map Join,由参数hive.auto.convert.join来控制,默认为true.)
5、合理使用Union All:对同一张表的union all 要比multi insert快的多。(对同一张表的union all 要比multi insert快的多。而多重insert也只扫描一次,但应为要insert到多个分区,所以做了很多其他的事情,导致消耗的时间非常长;)
6、并行执行Job:( set hive.exec.parallel=true; set hive.exec.parallel.thread.number=16;默认是8 )
7、采用local模式执行MR(数据量小的情况):如果在hive中运行的sql本身数据量很小,那么使用本地mr的效率要比分布式的快很多。但是要注意满足3个条件;①set hive.exec.mode.local.auto=true;②设置local mr的最大输入数据量,当输入数据量小于这个值的时候会采用local mr的方式set hive.exec.mode.local.auto.inputbytes.max=50000000;③设置local mr的最大输入文件个数,当输入文件个数小于这个值的时候会采用local mr的方式set hive.exec.mode.local.auto.tasks.max=10;
8、动态分区: SET hive.exec.dynamic.partition.mode = nonstrict; SET hive.exec.dynamic.partition = true;
9、避免数据: ①如果是使用COUNT DISTINCT和GROUP BY造成的数据倾斜,极有可能是存在大量空值或NULL,或者某一个值的记录特别多,可以先把该值过滤掉,在最后单独处理;②如果是使用JOIN引起的数据倾斜,极有可能是关联键存在大量空值或者某一特殊值,这时可以将空值特殊处理或者特殊值加随机数,同时还要注意关联的时候字段类型必须保持一致(不一致转成一致)
10、合理控制Map和Reduce个数: 参见http://lxw1234.com/archives/2015/04/15.htm
11、中间结果压缩:参见 http://superlxw1234.iteye.com/blog/1741103
最后,HQL优化其实也是MapReduce的优化,作为分布式计算模型,其最核心的地方就是要确保每个节点上分布的数据均匀,才能最大程度发挥它的威力
HIVE 优化总结
最新推荐文章于 2024-08-15 19:29:58 发布