文章目录
并行执行
Hive会将一个查询转化成一个或者多个阶段。
这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。
默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。
通过设置参数hive.exec.parallel值为true
,就可以开启并发执行。
不过,在共享集群中,需要注意下,如果 job 中并行阶段增多,那么集群利用率就会增加。
-- 打开任务并行执行,默认为false
set hive.exec.parallel=true;
-- 同一个sql允许最大并行度,默认为8
set hive.exec.parallel.thread.number=16;
- 建议在数据量大,子查询较多的时候使用。若数据量小,sql较为单一的时候开启,反而速度不如之前
严格模式
Hive可以通过设置防止一些危险操作:
1)分区表不使用分区过滤
将hive.strict.checks.no.partition.filter设置为true
时,对于分区表,除非 where语句 中含有分区字段过滤条件来限制范围,否则不允许执行。
换句话说,就是用户不允许扫描所有分区。
进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗巨大资源来处理这个表。
2)使用order by没有limit过滤
将hive.strict.checks.orderby.no.limit设置为true
时,对于使用了order by语句的查询,要求必须使用limit语句。
因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间(开启了limit可以在数据进入到reduce之前就减少一部分数据)。
3)笛卡尔积
将hive.strict.checks.cartesian.product设置为true
时,会限制笛卡尔积的查询。
对关系型数据库非常了解的用户可能期望在 执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。
不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。
执行计划(Explain)
1)基本语法
EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query
(1)查看下面这条语句的执行计划
hive (default)> explain select * from emp;
hive (default)> explain select deptno, avg(sal) avg_sal from emp group by deptno;
(2)查看详细执行计划
hive (default)> explain extended select * from emp;
hive (default)> explain extended select deptno, avg(sal) avg_sal from emp group by deptno;