如何通过修改org.apache.hadoop.hbase.mapreduce.RowCounter来处理hbase中的大量数据?

时间:2015-08-06 04:52:39

标签: java hadoop hbase

我的hbase表包含数百万行。如果我们进行扫描,则至少需要一个小时才能显示所有记录。我们将日期存储为行键。我需要获取日期的最小值和最大值。我看到了一个实用程序org.apache.hadoop.hbase.mapreduce.RowCounter,它在5分钟内计算了数百万行。以同样的方式对我的工作有什么办法吗?仅供参考:我使用的是java。

2 个答案:

答案 0 :(得分:2)

如果您使用HBase 0.98,您的问题应该很容易。您所要做的就是获取表中的第一行和最后一行(因为条目是有序的):

  • 您通过执行限制为1的扫描获得的第一行。
  • 通过执行带限制的反向扫描获得的最后一行 1。

您可以在此处找到有关反向扫描的更多信息:https://issues.apache.org/jira/browse/HBASE-4811

如果您使用的是以前版本的HBase,那么您应该考虑为您的表使用某些模型/约定。第一行很容易获得(再次只是在表格上扫描,限制为1),但对于最后一行,您遗憾的是没有反向扫描功能。

  1. 您可以设计为具有“颠倒”表格,如下所述:http://staltz.blogspot.com/2012/05/first-and-last-rows-in-hbase-table.html
  2. 由于您使用日期作为行密钥,因此您可能很有可能无法按降序方式接收数据(请参阅第1项的博客文章),因此您可以保留一个辅助表格。始终保留日期的最小值和最大值(也意味着您必须为插入/删除的每个记录执行代码检查并更新辅助表。
  3. 重新设计存储数据的方式。建议将初始表加上反向索引表并在反向索引表中存储数据(在rowkey上),例如:MAX_INTEGER - dataTimestamp,因此最新日期将是您的反向表上的第一个条目并通过扫描(限制为1)检索它。
  4. 由于HBase 0.98的解决方案非常简单,无需进行解决方法,如果您没有该版本,我建议您进行迁移。

答案 1 :(得分:1)

你的方向正确。 RowCounter用法是计算拥有数百万条记录的Hbase行的有效方法。您可以获取RowCounter的源代码并稍微调整一下以实现您的要求

  1. Rowcounter将在内部执行扫描。那么为什么它运行得很快,是因为Map减少了parellelism。现在,一旦你扫描了,我想,你可以随时保持过滤。因此,您可以识别该段代码并向其添加过滤器。
  2. 现在进行上述更改后,您的行计数器将计算与该过滤条件匹配的行。要扩展它,您可以参数化,列族,列限定符,值,运算符等。
  3. 我希望它有助于你的事业