一、关联优化器
在Hive的一些复杂关联查询中,可能同时还包含有group by等能够触发shuffle的操作,有些时候shuffle操作是可以共享的,通过关联优化器选项,可以尽量减少复杂查询中的shuffle,从而提升性能
set hive.optimize.correlation=true;
二、Hive并行执行
Hive会将一个查询转化为一个或多个阶段,包括:MapReduce阶段、抽样阶段、合并 阶段、limit阶段等。默认情况下,一次只执行一个阶段。不过,如果某些阶段不是互相依赖,是可以并行执行的。
-- 开启并发执行,默认为false
set hive.exec.parallel=true;
-- 同一个sql允许的最大并行度,默认为8
set hive.exec.parallel.thread.number=16;
三、Hive小文件合并
-- 是否开启合并Map端小文件,在Map-only的任务结束时合并小文件,true是打开
hive.merge.mapfiles
-- 是否开启合并Reduce端小文件,在map-reduce作业结束时合并小文件,true是打开
hive.merge.mapredfiles
-- 合并后MR输出文件的大小,默认为256M
hive.merge.size.per.task
-- 当输出文件的平均大小小于此设置值时,启动一个独立的map-reduce任务进行文件merge,默认值为16M。
hive.merge.smallfiles.avgsize
四、矢量化查询
hive的默认查询引擎一次处理一行,而矢量化查询执行是一种hive特性,目的是按照每批1024行读取数据,并且一次行对整个记录整合(而不是对单条记录)应用操作,注意:要是用矢量化查询执行,就必须以ORC格式存储数据
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;
五、读取零拷贝
ORC可以使用新的HDFS缓存API和ZeroCopy读取器来避免在扫描文件时将额外的数据赋值到内存中
set hive.exec.orc.zerocopy=true;