HIVE调优之开发调优(1)

目标

  1. Fetch
  2. 本地模式
  3. JVM重用
  4. map数量
  5. reduce数量
  6. 推测执行

Fetch

通过修改hive.fetch.task.conversion参数可以让一些select查询可以转换为单个获取任务,不需要执行MapReduce任务,从而最小化延迟。

目前的版本中支持none、minimal和more

  • none: 是禁用这一特性
  • minimal: 允许使用SELECT *FILTER on partition columns (WHERE and HAVING clauses)LIMIT only
  • more: 最大程度的允许使用 SELECT, FILTER, LIMIT only (including TABLESAMPLE, virtual columns)、where

当前版本默认使用more

本地模式

hive.exec.mode.local.auto 参数决定hive是否允许使用本地化,默认hive.exec.mode.local.auto=false 没有启用本地化

hive.exec.mode.local.auto.inputbytes.max 参数规定了使用本地化处理的最大的文件字节数,默认是128M

hive.exec.mode.local.auto.input.files.max 参数规定了使用本地化处理的最大文件数,默认是4个

JVM重用

在目前使用的版本中,mapreduce.job.jvm.numtasks 参数可以控制Java虚拟机的回收,由于mapTask或者reduceTask都是进程,需要启用JVM,作业运行结束了关闭JVM,使用这个参数控制JVM运行完作业不关机,继续执行作业。默认是1个。

<property>
<name>mapreduce.job.jvm.numtasks</name>
<value>1</value>
<description>How many tasks to run per jvm. If set to -1, there is no limit. </description>
</property>

map数量

mapTask数量由输入的文件大小、文件数和输入的文件产生多少个block决定。

那么我们如何考虑map的数量呢?

理论上讲mapTask越多Map作业的并行度越高,但是耗费的时间和资源也越多,map、reduce作业都是进程级别。

场景:128M的数据只有一两个列的数据记录数有几千万个,必须拆开用NTILE(n)==> 改变map任务的数量

reduce数量

mapred.reduce.tasks=-1 参数决定每个作业的默认数量。通常设置为接近可用主机数量的素数。通过将此属性设置为-1,Hive将自动计算出还原器的数量。默认是-1,即自动计算

hive.exec.reducers.bytes.per.reducer=256M 参数决定了reduce最大的字节数,在Hive 0.14.0及以后的版本中,默认为256 MB,也就是说,如果输入大小为1 GB,那么将使用4个reduce。

hive.exec.reducers.max=1099 参数决定最大可以使用的reduce数量,如果mapred.reduce.tasks 参数为-1,即自动计算reduce数量,那么Hive将使用这个参数作为最大的reduce数量,自动确定reduce的数量。

计算reducer数的公式很简单N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )

reduce的数量决定最终文件输出的数量
思路:reduce数量越多,小文件越多,reduce数量越少,文件大耗费的时间多,最终在reduce文件的大小和需要消耗的时间取个折中。 如果没有reduce,那么map的数据个数决定了输出文件个数 。

Spark3.0 自动适配

推测执行

  1. 作业完成时间取决于最慢的任务完成时间

    一个作业由若干个Map任务和Reduce任务构成。因硬件老化、软件Bug等,某些任务可能运行非常慢。

    思考:系统中有99%的Map任务都完成了,只有少数几个Map老是进度很慢,完不成,怎么办?

  2. 推测执行机制

    发现拖后腿的任务,比如某个任务运行速度远慢于任务平均速度。为拖后腿任务启动一个备份任务,同时运行。谁先运行完,则采用谁的结果。

  3. 执行推测任务的前提条件

  • 每个Task只能有一个备份任务

  • 当前 Job 已完成的 Task 必须不小于0.05(5%)

  • 开启推测执行参数设置。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>
  1. 不能启用推测执行机制情况
  • 任务间存在严重的数据倾斜,数据倾斜跑不过去的,开启多少个推测执行都跑不过去;

  • 特殊任务,比如任务向数据库中写数据。

  1. 生产建议

    一般生产生禁用此功能,除非特殊场景直接命令开启

Author: Tunan
Link: http://yerias.github.io/2018/11/12/hive/9/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.