HFile Mapreduce阶段的优化

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,
         
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值