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不支持这种优化。