Hive之语句调优

1.数据过滤

尽量先过滤数据,减少每个阶段的数据量,然后再进行join

2.分区

要合理使用分区,hive分区数据文件是放在不同目录下的

3.执行顺序

hive总是按照从左到右的顺序执行语句

4.job任务数

hive会对每次join启动一个mapreduce任务

当对3个或者更多个表进行join连接时,如果每个on都使用相同的连接键的话,那么只会产生一个mapreduce job

启动一次job尽可能的多做事情,一个job能完成的事情,不要两个job来做

5.join

hive顺序从左到右,同时假定最后一个表是最大的表。所以连接时小表放前边,先进内存,然后扫描大表进行计算

/*+STREAMTABLE(S)*/,hive会尝试将表s作为驱动表,即使其在查询中不是位于最后面的

/*MAPJOIN(A)*/ ,作用为小表先进内存,在mapper端直接join,省略掉reduce过程,减少大量时间

LEFT SEMI JOIN, 关联前过滤条件,只在on过滤条件,相当于等值连接但是不会产生重复数据区别于join

6.排序

Order by ,全局排序,但是在一个reduce中执行,需消耗大量时间

Sort by,部分排序,多个reduce,只能实现部分排序

Distribute by和group by控制reducer如何接受一行行数据,sort by控制reducer内部是如何进行排序的。Hive中distribute by要写在sort by之前,两个一起使用可以实现order by

Cluster by,全局排序,但是只能默认升序

7.数据倾斜

避免数据倾斜,数据倾斜会使跑数时间大幅增加

8.小文件

如果数据量较大,一定要合并小文件,否则会非常影响表查询的效率

Map输入合并
set mapred.max.split.size=256000000;  #每个Map最大输入大小
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并
在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~

输出合并
set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

9.参数

善于使用hive的各类常用参数,提高语句效率

10.mapreduce

最好熟悉mapreduce整个运行原理,了解里面各个环节的加工过程,从而有针对性的去优化

 

posted @ 2018-12-05 15:29  才华充电中  阅读(1796)  评论(0编辑  收藏  举报