HBase批量加载会产生大量的reducer任务 - 任何解决方法

时间:2011-02-14 16:16:46

标签: hadoop hbase bulk-load

HBase批量加载(使用configureIncrementalLoad helper方法)将作业配置为创建与hbase表中的区域一样多的reducer任务。因此,如果有几百个区域,那么该作业将产生几百个减速器任务。这可能会在一个小集群上变得非常缓慢。

使用MultipleOutputFormat或其他什么方法可以解决问题吗?

由于

2 个答案:

答案 0 :(得分:1)

  1. 按地区划分减少阶段会给您带来很多长期利益。导入的数据联机后,您将获得数据位置。您还可以确定何时将区域负载平衡到另一台服务器。我不会那么快地去更粗略的粒度。
  2. 由于reduce阶段是单个文件写入,因此您应该能够设置NumReduceTasks(硬盘驱动器数量)。这可能会加快速度。
  3. 很容易出现网络瓶颈。确保你正在压缩你的HFile&您的中间MR数据。

      job.getConfiguration().setBoolean("mapred.compress.map.output", true);
      job.getConfiguration().setClass("mapred.map.output.compression.codec",
          org.apache.hadoop.io.compress.GzipCodec.class,
          org.apache.hadoop.io.compress.CompressionCodec.class);
      job.getConfiguration().set("hfile.compression",
          Compression.Algorithm.LZO.getName());
    
  4. 您的数据导入大小可能足够小,您应该使用基于Put的格式进行查看。这将调用普通的HTable.Put API并跳过reducer阶段。请参阅TableMapReduceUtil.initTableReducerJob(table,null,job)。

答案 1 :(得分:0)

当我们使用HFileOutputFormat时,无论你设置什么,它都会覆盖reducer的数量。 reducer的数量等于该HBase表中的区域数量。 因此,如果要控制减速器的数量,请减少区域数量。

您会找到示例代码here

希望这会有用:)