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整个运行原理,了解里面各个环节的加工过程,从而有针对性的去优化