MapReduce结果的增量更新

时间:2013-03-26 14:15:34

标签: java search hadoop mapreduce hbase

我有一个MapReduce作业,用于填充HBase中的搜索索引。此MapReduce作业每天在完整数据集上运行。有没有办法可以在上次计算索引后到达的新数据上运行MapReduce,然后在HBase中正确更新搜索索引?

1 个答案:

答案 0 :(得分:0)

如果原始数据保存在HBase中,您可以设计密钥,以便按时间对行进行排序。然后,您可以使用开始行扫描表格,该开始行定义为您昨天扫描的最后一行+ 1。您也可以将键从日期开始。由于行按键排序,您可以轻松地从所需日期的第一行开始,然后在第二天停止。

如果您将行创建为:

long currentTimeMS = System.currentTimeMillis();
long currentDay = currentTimeMS / (1000 * 60 * 60 * 60 * 24);
Put put = new Put(Bytes.add(Bytes.toBytes(currentDay), "some other key stuff".getBytes()));
// add columns...
hbaseTable.put(put);

您可以使用以下方法扫描一天的数据:

long currentDay = currentTimeMS / (1000 * 60 * 60 * 60 * 24);
long yesterday = currentDay - 1;

Scan dayScan = new Scan(); 
dayScan.setStartRow(Bytes.toBytes(yesterday));
dayScan.setStopRow(Bytes.toBytes(currentDay));
// create map reduce job with dayScan

有一些像Joda Time这样的库使得时间计算更容易,代码更易读。

您也可以尝试scan.setTimeRange()获得类似的结果。但是这假设您插入并且从不更新源行,因为它实际上在列版本的 udpate 时间运行。由于按行键排序,数据可能不会靠近,因此速度可能会慢一些。总的来说,这似乎不是推荐的方式。但是对于快速和肮脏的原型设计,它可以工作。

如果您直接从HDFS扫描数据,那么您可以通过每天将数据保存到不同的目录来实现类似的功能。然后,您只能扫描昨天的目录,而不是其他任何内容。