Hive 调优,先掌握这几种优化模式

2020-03-25 19:39:21 浏览数 (1)

Hive和MapReduce中拥有较多在特定情况下优化的特性,如何利用好相关特性,是Hive性能调优的关键。本文就介绍那些耳熟但不能详的几种Hive优化模式。

本地模式

当一个MapReduce任务的数据量和计算任务很小的时候,在MapReduce框架中Map任务和Reduce任务的启动过程占用了任务执行的大部分时间,真正的逻辑处理其实占用时间很少,但是给用户的感受就是:很小的任务,同样执行较长的时间。比如对一张码表进行计算,总时间可能接近1~2分钟,这个对于用户来说,感受很差。

那么在0.7版本之后,Hive引入了本地模式,那么对于小任务的执行,Hive客户端不再需要到Yarn上申请Map任务和Reduce任务,只需要在本地进行Map和Reduce的执行,大大的加快了小任务的执行时间,通常可以把分钟级别任务的执行时间降低秒级。

参数设置:

参数名称

默认值

说明

hive.exec.mode.local.auto

false

是否开启本地模式

hive.exec.mode.local.auto.inputbytes.max

134217728

该参数限定了Map输入的文件大小。如果是高压缩率列存文件,可适当减小此值,避免进入本地模式,一般选择默认值即可。

hive.exec.mode.local.auto.input.files.max

4

参数限定了Map输入的文件个数。如果是多个小文件,可适当增大此值,一般选择默认值即可。

实际测试中,使用本地模式之后,对于小表的计算查询能从34秒减少到2秒。

并行模式

Hive的Parallel特性使得某些任务中的stage子任务以并行执行模式同时执行,相对于一直串行执行stage任务来说有效的提升资源利用率。

Parallel特性主要针对如下几种情况:

  • 多个数据表关联
  • 插入多个目标表
  • UNION ALL

参数设置:

参数名称

默认值

说明

hive.exec.parallel

false

是否开启自动转换为PARALLEL

hive.exec.parallel.thread.number

8

最大并行度

实际测试中,我们选用TDC-DS中的Q11,从对比结果看,在使用Parallel特性之后,由原来的743秒减少到600秒,在并行任务数据量较大,集群资源较充足,计算较复杂的情况下,任务执行效率提升会更加明显。

严格模式

Hive提供一个严格模式,可以防止用户执行那些可能产生意想不到的影响查询。

参数设置:

参数名称

默认值

说明

hive.mapred.mode

hive 1.x 默认nostrict;hive 2.x 默认strict(HIVE-12413)

设置hive的严格模式

通过设置hive.mapred.mode的值为strict,开启严格模式可以禁止3种类型的查询:

(1) 对于分区表,要求必须限定分区字段,换句话说就是不允许扫描所有的分区,这是因为通常所有分区的数据量都比较大,这样可以避免消耗大量资源。

(2) 对于使用order by的查询,要求必须使用limit语句,因为order by为了执行排序过程会将所有的结果数据分发到同一个reducer中进行处理,这样可以避免reducer执行过长的时间。

(3)限制笛卡尔积查询,要求两张表join时必须有on语句。

Uber模式

Uber模式准确的说并不是Hive的优化特性,是Yran上针对MR小作业的优化机制,如果job任务足够小,则直接让任务串行的在MRAppMaster完成,这样整个Application只会使用一个Container(JVM重用功能),相对于分配多个Container来说执行效率要高很多。

参数设置:

参数名称

默认值

说明

mapreduce.job.ubertask.enable

false

是否开启小任务ubertask优化模式

mapreduce.job.ubertask.maxmaps

9

设置Uber模式的最大Map数量

mapreduce.job.ubertask.maxreduces

1

设置Uber模式的最大Reduce数量

mapreduce.job.ubertask.maxbytes

dfs.block.size

设置Uber模式的最大字节数

仅仅满足以上四个参数还不行,因为作业是在AM所在的Container中运行,Uber任务执行还应满足如下条件:

(1) Map内存设置(mapreduce.map.memory.mb)和Reduce内存设置(mapreduce.reduce.memory.mb)必须小于等于AM所在容器内存大小设置(yarn.app.mapreduce.am.resource.mb)。

(2) Map配置的vcores(mapreduce.map.cpu.vcores)个数和 Reduce配置的vcores(mapreduce.reduce.cpu.vcores)个数也必须小于等于AM所在容器vcores个数的设置(yarn.app.mapreduce.am.resource.cpu-vcores)。

上面就是今天介绍的Hive优化模式,你是不是都掌握了呢。

0 人点赞