目录
Hadoop使用中,小文件不仅会导致Namenode内存不足、存储效率低的问题,还会在进行MR计算时,会导致生成过多的切片,需要启动过多的MapTask。每个MapTask的运行都对应一个JVM,那么如此多的JVM开启和关闭,不仅造成了资源的浪费,还降低了计算效率。
解决小文件问题方式很多,除了使用CombineTextInputFormat来减少切片数量,还可以使用Uber模式。
一、什么是Uber模式
Uber模式是Hadoop的一种job运行模式,该模式开启时,在设定的范围内,对一个job,只会提供一个Containor,启动一个JVM来运行所有的MapTask和ReduceTask。
二、如何开启Uber模式
开启uber模式,需要在Hadoop的mapred-site.xml中添加如下配置。
- 将mapreduce.job.ubertask.enable 设置成true
- maxmaps:指单个JVM中能够运行的最多的MapTask数量,要求≤9
- maxreduces:指单个JVM中能够运行的最多的ReduceTask数量,要求≤1
- maxbytes:指单个JVM中允许的最大数据量,空为没要求
<!-- 开启uber模式 -->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!-- uber模式中最大的mapTask数量,可向下修改 -->
<property>
<name>mapreduce.job.ubertask.maxmaps</name>
<value>9</value>
</property>
<!-- uber模式中最大的reduce数量,可向下修改 -->
<property>
<name>mapreduce.job.ubertask.maxreduces</name>
<value>1</value>
</property>
<!-- uber模式中最大的输入数据量,如果不配置,则使用dfs.blocksize 的值,可向下修改 -->
<property>
<name>mapreduce.job.ubertask.maxbytes</name>
<value></value>
</property>
综上,如果开启了Uber模式,MrApplicationMaster在判定输入文件的要求在单JVM要求内时,就会启动单JVM运行,如此有效了降低了MrApplication的资源申请数,和JVM多次个开启和关闭,节省资源,提升效率。