【大数据之Hive】二十七、HQL之Fetch抓取、本地模式、并行执行、严格模式

1 Fetch抓取

  Fetch抓取是指Hive中对某些情况的查询可以不必使用MapReduce计算。例如:select * from emp;在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。

相关参数:

--是否在特定场景转换为fetch 任务
--设置为none表示不转换
--设置为minimal表示支持select*,分区字段过滤,Limit等
--设置为more表示支持select任意字段,包括函数,过滤,和limit等
set hive.fetch.task.conversion=more;

2 本地模式

  把原来需要提交到yarn上运行的任务放到本地上运行,在本地的一个进程中完成分布式运算,所以数据量不能太大。
  有时Hive的输入数据量是非常小的,在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

相关参数:

--开启自动转换为本地模式,根据输入的数据两判断,小于输入的阈值则自动使用本地模式
set hive.exec.mode.local.auto=true; 

--设置local MapReduce的最大输入数据量,当输入数据量小于这个值时采用local MapReduce的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;

--设置local MapReduce的最大输入文件个数,当输入文件个数小于这个值时采用localMapReduce的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;

3 并行执行

  Hive会将一个SQL语句转化成一个或者多个Stage,每个Stage对应一个MR Job。默认情况下,Hive同时只会执行一个Stage。
  SQL语句可能会包含多个Stage,但多个Stage可能并非完全互相依赖,即有些Stage是可以并行执行的。

相关参数:

--启用并行执行优化
set hive.exec.parallel=true;       
   
--同一个sql允许最大并行度,默认为8
set hive.exec.parallel.thread.number=8; 

4 严格模式

  Hive通过设置某些参数防止危险操作。

1、分区表不适用分区过滤

--对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。
set hive.strict.checks.no.partition.filter=true;

  即用户不允许扫描所有分区。因为通常分区表都是非常大的数据集,且数据增加迅速,没有进行分区限制的查询可能会消耗巨大资源处理这个表。

2、使用 order by 没有 limit 过滤

--使用了order by语句的查询,要求必须使用limit语句。
set hive.strict.checks.orderby.no.limit=true;

  因为order by为了执行排序过程会将所有的结果数据分发到同一个Reduce中进行处理,强制要求用户增加这个limit语句可以防止Reduce额外执行很长一段时间(即开启了limit可以在数据进入到Reduce之前就减少一部分数据)。

3、笛卡尔积

--限制笛卡尔积的查询.
set hive.strict.checks.cartesian.product=true;

  有些用户在执行join查询时不适用on语句而使用where语句,关系型数据库的执行优化器可以将where语句转化为on语句。但HIve不支持这种优化。

你可能感兴趣的:(hive,hive,大数据,hadoop)