今天和大家聊一下Hive SQL的优化方法。Hive的本质是MapReduce,所以hive sql优化的核心思想就是:MapReduce的优化!!!所以大家要对MapReduce流程以及原理有一定的了解。
常用的通用优化方法
1、抓取策略
抓取策略下,hive中对某些情况的查询不需要使用MapReduce计算
set hive.fetch.task.conversion = more(默认是开启的)
2、explain extended显示查询计划(下期详解)
3、并行计算
set hive.exec.parallel = true; 开启并行,开启后默认8个
hive.exec.parallel.thread.number 设置并行个数
4、严格模式 (限制查询条件)
set hive.mapred.mode = strict
严格模式下对查询的限制:
①分区表必须添加where对分区字段的条件过滤
②order by语句必须包含limit输出限制
③限制执行笛卡尔积的查询
5、排序优化
order by 是全排序,所有的数据都会由一个reduce来处理
sort by 对于单个reduce的数据进行排序
distribute by 分区排序,经常和sort by结合使用代替order by
如下:distribute by column sort by column asc/desc
cluster by 相当于sort by + distribute by,但是不能通过asc、desc来指定排序方式
所以排序推荐sort by、distribute by
6、join优化
①小表在左边
②使用相同的连接键,即on条件中尽量使用相同key
select * from table1 left join table2 on table1.key=table2.key
③在map端完成聚合,即map join (还有其他相关配置参数,感兴趣的可以自己查一下)
手动:/*+mapjoin(smalltable) */ 放小表
如:select /*+mapjoin(smalltable) */ smalltable.key,bigtable.value from smalltable join bigtable on smalltable.key=bigtable.key
自动:set hive auto.convert.join = true
7、map端聚合 (还有相关配置参数)
set hive.map.aggr = true 开启map端聚合
hive.groupby.skewindata = true 优化数据倾斜,执行两次mr
8、合并小文件
hive.merge.mapfile = true 是否合并map端输出文件
hive.merge.reducefile = true 是否合并reduce端输出文件
hive.merge.size.per.task=256*1000*1000 设置合并文件大小阈值,即超过256M的文件不合并
9、JVM重用
适用于小文件个数多、task个数多的场景
set mapred.job.reuse.jvm.num.tasks=n ;n为插槽个数
缺点:设置开启后,task槽会一直占用资源,不论是否又task运行,知道任务执行完才会释放资源
最后强烈推荐到hive官网看官方文档!!!
Hive官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual