目标
- Fetch
- 本地模式
- JVM重用
- map数量
- reduce数量
- 推测执行
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> |
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 自动适配
推测执行
作业完成时间取决于最慢的任务完成时间
一个作业由若干个Map任务和Reduce任务构成。因硬件老化、软件Bug等,某些任务可能运行非常慢。
思考:系统中有99%的Map任务都完成了,只有少数几个Map老是进度很慢,完不成,怎么办?
推测执行机制
发现拖后腿的任务,比如某个任务运行速度远慢于任务平均速度。为拖后腿任务启动一个备份任务,同时运行。谁先运行完,则采用谁的结果。
执行推测任务的前提条件
每个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>
- 不能启用推测执行机制情况
任务间存在严重的数据倾斜,数据倾斜跑不过去的,开启多少个推测执行都跑不过去;
特殊任务,比如任务向数据库中写数据。
生产建议
一般生产生禁用此功能,除非特殊场景直接命令开启