HBase 批量加载会产生大量减速器任务 - 任何解决方法

发布于 2024-10-17 11:38:13 字数 190 浏览 8 评论 0原文

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

是否可以通过使用 MultipleOutputFormat 或其他方法来解决问题?

谢谢

HBase bulk load (using configureIncrementalLoad helper method) configures the job to create as many reducer task as the regions in the hbase table. So if there are few hundred regions then the job would spawn few hundred reducer tasks. This could get very slow on a small cluster..

Is there any workaround possible by using MultipleOutputFormat or something else?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不即不离 2024-10-24 11:38:13
  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. Sharding the reduce stage by region is giving you a lot of long-term benefit. You get data locality once the imported data is online. You also can determine when a region has been load balanced to another server. I wouldn't be so quick to go to a coarser granularity.
  2. Since the reduce stage is going a single file write, you should be able to setNumReduceTasks(# of hard drives). That might speed it up more.
  3. It's very easy to get network bottlenecked. Make sure you're compressing your HFile & your intermediate MR data.

      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. Your data import size might be small enough where you should look at using a Put-based format. This will call the normal HTable.Put API and skip the reducer phase. See TableMapReduceUtil.initTableReducerJob(table, null, job).

如梦亦如幻 2024-10-24 11:38:13

当我们使用 HFileOutputFormat 时,它会覆盖您设置的减速器数量。
减速器的数量等于该 HBase 表中的区域数量。
因此,如果您想控制减速器的数量,请减少区域的数量。

您将找到示例代码 这里

希望这会有用:)

When we use HFileOutputFormat, its overrides number of reducers whatever you set.
The number of reducers is equal to number of regions in that HBase table.
So decrease the number of regions if you want to control the number of reducers.

You will find a sample code here:

Hope this will be useful :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文