CBO优化

CBO是指Cost based Optimizer,即基于计算成本的优化。

在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。

主要是数据的行数

Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。

目前CBO在hive的MR引擎下主要用于join的优化,例如多表join的join顺序。

-- 是否启用cbo优化 
set hive.cbo.enable=true;

谓词下推

谓词下推(predicate pushdown)是指,尽量将过滤操作前移,以减少后续计算步骤的数据量。

--是否启动谓词下推(predicate pushdown)优化
set hive.optimize.ppd = true;

需要注意的是:

CBO优化也会完成一部分的谓词下推优化工作,因为在执行计划中,谓词越靠前,整个计划的计算成本就会越低。

矢量化查询

Hive的矢量化查询优化,依赖于CPU的矢量化计算。

CPU的矢量化计算的基本原理,类似矩阵,将多个单独计算做成矩阵一次性提交计算

set hive.vectorized.execution.enabled=true;
-- 若执行计划中,出现“Execution mode: vectorized”字样,即表明使用了矢量化计算。

Hive的矢量化查询,可以极大的提高例如scans, filters, aggregates, andjoins等典型查询场景下的CPU使用效率。

Fetch抓取

Fetch抓取是指Hive中对某些情况的查询可以不必走MapReduce计算

--是否在特定场景转换为fetch 任务
--设置为none表示不转换
--设置为minimal表示支持select *,分区字段过滤,Limit等
--设置为more表示支持select 任意字段,包括函数,过滤,和limit等
set hive.fetch.task.conversion=more;

并行执行

不相关没有相互依赖的stage同时进行,这里的并行指的是stage的并行。

Hive会将一个SQL语句转化成一个或者多个Stage,每个Stage对应一个MRJob。默认情况下,Hive同时只会执行一个Stage。但是某SQL语句可能会包含多个Stage,但这多个Stage可能并非完全互相依赖,也就是说有些Stage是可以并行执行的。

--启用并行执行优化
set hive.exec.parallel=true;       
    
--同一个sql允许最大并行度,默认为8
set hive.exec.parallel.thread.number=8;

严格模式

为了安全,防止一些误操作

分区表不使用分区过滤

对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。

set.hive.strict.checks.no.partition.filter设置为true时

使用order by没有limit过滤

set.hive.strict.checks.orderby.no.limit设置为true时

对于使用了order by语句的查询,要求必须使用limit语句。

开启了limit可以在数据进入到Reduce之前就减少一部分数据。