大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的,就是在yarn上运行。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。
主要注意的是本地MapReduce模式只有在ReduceTask数量为1的时候才有效.

set hive.exec.mode.local.auto=true; //开启本地mr,不走yarn ,其实数据量少的时候本地模式快,但是数据量大的时候还不如yarn,因为yarn是分布式运算.

//设置本地MapReduce的最大输入数据量,当输入数据量小于这个值时采用本地MapReduce的方式,默认为134217728,即128M,下面的参数值,如果任务小于这个值的话就在本地模式运行,否则就采用yarn模式运行.
set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置本地MapReduce的最大输入文件个数,当输入文件个数小于这个值时采用本地MapReduce的方式运行,默认为4,如果超过了这个数量就会在yarn上面运行.

set hive.exec.mode.local.auto.input.files.max=10;

临时设置

注意,这样的配置只是当前会话有效,关闭客户端就失效了,如果想一直有效,就配置到配置文件里面去.

  1. # 查看初始值 ,默认是false
  2. set hive.exec.mode.local.auto;
  3. # 开启本地模式,并执行查询语句
  4. set hive.exec.mode.local.auto=true;
  5. # 执行查询语句看看时间
  6. select * from emp cluster by deptno;
  7. Time taken: 1.328 seconds, Fetched: 14 row(s)
  8. # 关闭本地模式,并执行查询语句
  9. set hive.exec.mode.local.auto=false;
  10. # 执行查询语句看看时间
  11. select * from emp cluster by deptno;
  12. Time taken: 20.09 seconds, Fetched: 14 row(s)

能看到时间相差了不少

永久设置

在 /hive-1.2.1/conf 文件夹下面找到hive-site.xml 配置文件

hive-site.xml :

  1. <property>
  2. <name>hive.exec.mode.local.auto</name>
  3. <value>true</value>
  4. </property>

保存之后重启hive

如何重启hive 如果不会的话,查看这个:

添加链接描述

重启hive需要等待一会儿,重启完了查看配置是否生效

sql:

  1. set hive.exec.mode.local.auto;

hive本地模式执行hive,减少sql处理结果用的时间 - 图1
说明配置生效了.

效果对比

没配置之前

  1. sql> select t1.base,
  2. concat_ws('|', collect_set(t1.name)) name
  3. from (select name,
  4. concat(constellation, ",", blood_type) base
  5. from person_info) t1
  6. group by t1.base
  7. [2020-10-03 16:21:31] 3 rows retrieved starting from 1 in 32 s 156 ms (execution: 32 s 129 ms, fetching: 27 ms)

配置之后

  1. [2020-10-03 16:34:05] 1 row retrieved starting from 1 in 24 ms (execution: 8 ms, fetching: 16 ms)
  2. sql> select t1.base,
  3. concat_ws('|', collect_set(t1.name)) name
  4. from (select name,
  5. concat(constellation, ",", blood_type) base
  6. from person_info) t1
  7. group by t1.base
  8. [2020-10-03 16:34:34] 3 rows retrieved starting from 1 in 3 s 306 ms (execution: 3 s 271 ms, fetching: 35 ms)

可以看到差距是很大的.