使用 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 源的主要内容,如果未能解决你的问题,请参考以下文章