HiveQL:调优

1.使用EXPLAN/EXPLAN EXTENDED查看执行计划

-- 待补充

2.本地模式

/*
有时候hive查询数据量是非常小的,这种情况下,为查询触发执行任务对的时间消耗有可能比实际job执行时间要多得多。对于大多数这种情况,Hive可以通过本地模式在单台机器上(或某些时候在单个进程中)处理所有的任务,这样对于小数据集,执行时间明显被缩短。
*/
set mapred.tmp.dir = local

3.并行执行

/*Hive会将一个查询转化成一个或者多个阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的的job可能包含众多的阶段,而这些阶段并非是完全相互依赖的,也就是说有些阶段是可以并行执行的,这样坑使得整个job的执行时间缩短。
*/
-- 设置参数
hive.exec.parallel = true
SET hive.exec.parallel.thread.number=16;

4.严格模式

/*
Hive提供了一个严格模式,可以防止用户执行那些可能产生一些不合适的查询
*/
-- 设置参数
hive.mapred.mode = true
/*
可以进制三类查询
1.对于分区表,除非WHERE语句中含有分区字段过滤条件来限制数据范围,否则不允许执行。避免全表扫描占用过大资源
2.对于使用ORDER BY语句的查询,要求必须使用LIMIT语句,因为ORDER BY为了执行排序过程会将所有的结果数据分发到同一个reducer中进行处理,强制要求用户增加整个LIMIT语句可以防止reducer而外执行很长一段时间。
3.限制笛卡尔积查询。对于关系行数据库,用户在JOIN时不用ON用WHERE语句,执行优化器会会将WHERE转化成ON,但是hive不会执行这种优化
*/

5.调整mapper和reducer个数

/*
Hive是按照输入数据的数据量大小来确定reducer个数的,我们可以通过dfs -count命令来计算输入量的大小
*/
hive.exec.reducers.bytes.per.reducer --默认是为1GB
mapred.reduce.tasks -- 可以设置reduce task的大小,但是不推荐设置确定的,会导致会变慢。
hive.exec.reducers.max -- 在共享集群上处理大任务时,为了控制资源控制情况,可以阻止某个查询消耗太多的reducer资源。

6.JVM重用

-- 待补充

7.动态分区调整

-- 设置参数
hive.exec.dynamic.partition.mode = strict -- 严格模式时,至少有一个为静态分区
hive.exec.max.dynamic.partitions -- 限制最大的动态分区的个数
hive.exec.max.dynamic.partitions.pernode -- 

8.推测执行

/*
推测执行是hadoop的一个功能,其可以触发执行一些重复的任务(task).目标是通过加快task的结果以及进行侦测将执行满的TaskTracker加入到黑名单的方式提高整体的效率。
*/
mapred.map.tasks.speculative.execution = true
mapred.reduce.tasks.speculative.execution = true
原文地址:https://www.cnblogs.com/lijingang/p/11395148.html