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