使用 HBase 表作为 MapReduce 源

Posted

技术标签:

【中文标题】使用 HBase 表作为 MapReduce 源【英文标题】:Using an HBase table as MapReduce source 【发布时间】:2015-04-24 19:56:13 【问题描述】:

据我了解,当使用 hbase 表作为 mapreduce 作业的源时,我们已经定义了扫描的值。假设我们将其设置为 500,这是否意味着每个映射器仅从 hbase 表中获得 500 行?如果我们将其设置为非常高的值会有什么问题吗?

如果扫描大小很小,我们不会和mapreduce中的小文件有同样的问题吗?

【问题讨论】:

您的问题不清楚。您能否在为作业配置扫描对象的位置发布您的代码并澄清您的问题? 我还没有代码,这更像是一个设计问题 【参考方案1】:

这是来自HBase Book 的示例代码,介绍了如何运行从 HBase 表读取的 MapReduce 作业。

Configuration config = HBaseConfiguration.create();
Job job = new Job(config, "ExampleRead");
job.setJarByClass(MyReadJob.class);     // class that contains mapper

Scan scan = new Scan();
scan.setCaching(500);        // 1 is the default in Scan, which will be bad for MapReduce jobs
scan.setCacheBlocks(false);  // don't set to true for MR jobs
// set other scan attrs
...

TableMapReduceUtil.initTableMapperJob(
   tableName,        // input HBase table name
   scan,             // Scan instance to control CF and attribute selection
   MyMapper.class,   // mapper
   null,             // mapper output key
   null,             // mapper output value
   job);
job.setOutputFormatClass(NullOutputFormat.class);   // because we aren't emitting anything from mapper

boolean b = job.waitForCompletion(true);
if (!b) 
    throw new IOException("error with job!");

当您说“扫描的价值”时,这不是真的。你的意思要么是scan.setCaching(),要么是scan.setBatch(),要么是scan.setMaxResultSize()

    setCaching 用于告诉服务器在将结果返回给客户端之前要加载多少行 如果您的表格非常宽,setBatch 用于限制每次调用中返回的列数 setMaxResultSize 用于限制返回给客户端的结果数

通常不会在 MapReduce 作业中设置 MaxResultSize。所以你会看到所有的数据。

以上信息参考here。

【讨论】:

【参考方案2】:

您编写的映射器代码逐行提供数据。然而,映射器运行时将通过缓存端读取记录(即在您的情况下一次读取 500 行)。

如果扫描大小太小,执行效率会非常低(大量 io 调用)

【讨论】:

以上是关于使用 HBase 表作为 MapReduce 源的主要内容,如果未能解决你的问题,请参考以下文章

无法从 MapReduce 代码访问 HBase

HBase整合MapReduce之建立HBase索引

如何从 Result 对象中获取 HBase 表名作为 mapreduce 参数?

使用mapreduce复制hbase表

从 hadoop mapreduce 访问 hbase 表

04 HBase与MapReduce整合