说明

hivesql应该越简单约好,sql优化一定要先确定瓶颈,瓶颈确定了才能针对性的去进行优化,否则就是自寻烦恼

关于union的优化

一般来说stage越多,意味着中间会有更多的中间数据落地磁盘,增大网络IO磁盘IO,建议熟练使用HIVE新版本支持的groupsetting函数去替换

调整数据存储块大小

 数据块较大且集中,意味着会增大网络传输压力,数据块较小较多,会增大namenode读写的压力,join的时候可能会消耗大量的cpu/memory资源

HIVE分区分桶

适时使用HIVE分区分桶机制

sql-Hint

使用sql-hint,在sql中/*+mapjoin(little table)*/指定mapjoin小数据量表,在map阶段完成连接计算,通过此语法实现对计算引擎执行过程的干预

count(distinct)

新版本的hive3.x对count(distinct)的算法有所优化(需要设置hive.optimization.countdistinct 此参数)

但是还是希望改成group by的方式来代替,conunt(disctinct)一般只会有一个reduce来处理,如果数据量大很容易遇到数据倾斜问题

向量化开关的使用

打开向量化开关之后可以批量读取数据,可以大大减少扫描、过滤器、聚合和连接等典型查询操作的cpu使用,减少底层操作系统处理数据时的指令和上下文切换

set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;

开启并行查询

并行这行是大数据分布式计算的核心概念,sql开发者提交的每个sql都会尽量被分解成各个可以并行执行的任务去执行

set hive.exec.parallel=true; //可以开启并发执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。

mapjoin的开启

mapjoin的开启类似spark的小表广播变量,mapjoin会启动一个job,读取小表的数据,在内存中去构建hash,然后落地写到磁盘再分发到分布式缓存中,然后与另一个表进行连接计算

shuffle阶段避免重复hash

如果在同一个sql中发生了join和groupby而且是作用于同一个appkey,可以设置此参数,避免重复再shuffle阶段进行hash

set hive.optimize.correlation=true;