通过设置参数hive.exec.parallel值为true,就可以开启并发执行。
在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
六、严格模式
通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。
开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。
<property>
<name>hive.mapred.mode</name>
<value>strict</value>
<description>
The mode in which the Hive operations are being performed.
In strict mode, some risky queries are not allowed to run. They include:
Cartesian Product.
No partition being picked up for a query.
Comparing bigints and strings.
Comparing bigints and doubles.
Orderby without limit.
</description>
</property>
(1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。
(2)对于使用了order by语句的查询,要求必须使用limit语句。
(3)限制笛卡尔积的查询。
七、JVM重用
Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。
它的启动会有相当大的开销,尤其是执行job包含成百上千task任务的情况。
JVM重用可以使得JVM实例在同一个job中重新使用N次。
N的值可以在Hadoop的mapred-site.xml文件中进行配置。
<property>
<name>mapreduce.job.jvm.numtasks</name>
<value>10</value>
<description>How many tasks to run per jvm. If set to -1, there is
no limit.
</description>
</property>
缺点:开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。
八、推测执行
1.设置开启推测执行参数:
Hadoop的mapred-site.xml文件中进行配置
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some map tasks
may be executed in parallel.</description>
</property>
<property>
<name>mapreduce.reduce.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some reduce tasks
may be executed in parallel.</description>
</property>
2.hive本身也提供配置
控制reduce-side的推测执行:
<property>
<name>hive.mapred.reduce.tasks.speculative.execution</name>
<value>true</value>
<description>Whether speculative execution for reducers should be turned on.
</description>
</property>
3.建议
如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。
如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,
那么启动推测执行造成的浪费是非常巨大的。
九、执行计划
(1)查看下面这条语句的执行计划
explain select * from emp;
explain select deptno, avg(sal) avg_sal from emp group by deptno;
(2)查看详细执行计划
explain extended select * from emp;
explain extended select deptno, avg(sal) avg_sal from emp group by deptno;