Optimize Map/Reduce Job for HBase
- 1 背景
- 2 Map阶段的木桶原理
- 3 MapTask的产生
- 4 优化
1.背景
MapReduce 的优化工作一直比较受重视,官方也提供了很多的接口。不同的实际生产环境可以使用自己开发的API,来获得更好的效率。这次分享一下最近开发的一个HFile的MapReduce的优化开发思想。
2.Map阶段的木桶原理
MapReduce中Map阶段的木桶原理:
木桶原理又称作短板理论,即Map阶段的结束始终跟最慢的那个map有关。
举一个例子:
在一个mapreduce的任务中,总共分了10个map,其中最快的在20s完成,最慢的在30min完成。那么map阶段的结束应该是在30min的时候,而不是平均时间。
注:
<property>
<name>mapreduce.job.reduce.slowstart.completedmaps</name>
<value>0.8</value>
</property>
这个配置可以使reduce阶段在map成功80%的时候启动。如果这个MapTask在本地运行的话,这个配置可以提早map阶段的结束时间。如果不幸这个map需要读取远端的数据的话,将占用带宽,MapReduce的速度可能反而会更慢。
3.MapReduce 中的Map任务如何产生
1.InputFormat类,getSplits方法和InputSplit类
下面这段是产生MapTask的源代码:
@SuppressWarnings("unchecked")
private <T extends InputSplit>
int writeNewSplits(JobContext job, Path jobSubmitDir) throws IOException,
InterruptedException, ClassNotFoundException {
Configuration conf = job.getConfiguration();
//step1 find the InputFormatClass
InputFormat<?, ?> input =
ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
//step2 excute the getSplits method
List<InputSplit> splits = input.getSplits(job);
T[] array = (T[]) splits.toArray(new InputSplit[splits.size()]);
Arrays.sort(array, new SplitComparator());
//step3 write the split to hdfs
JobSplitWriter.createSplitFiles(jobSubmitDir, conf,
jobSubmitDir.getFileSystem(conf), array);
return array.length;
}
在源代码中可以看到执行过程step1step2,先找到InputFormat类,然后执行getSplits方法。每一个InputSplit最终将成为一个Map任务。这个InputSplit数组将决定Map任务的个数,以及决定Map任务是否分配均匀。
2.TableInputFormat
如果我们使用默认的HbaseMapreduce的Api,代码如下:
TableMapReduceUtil.initTableMapperJob(
sourceTable, // input table
scan, // Scan instance to control CF and attribute selection
MyMapper.class, // mapper class
null, // mapper output key
null, // mapper output value
job);
在initTableMapperJob方法中,我们将使用TableInputFormat.class作为InputFormat。
public static void initTableMapperJob(String table, Scan scan,
Class<? extends TableMapper> mapper,
Class<?> outputKeyClass,
Class<?> outputValueClass, Job job,
boolean addDependencyJars)
throws IOException {
initTableMapperJob(table, scan, mapper, outputKeyClass,