Java MapReduce结果的增量更新
我有一个MapReduce作业,它在HBase中填充搜索索引。此MapReduce作业每天在完整的数据集上运行。有没有办法对上次计算索引后到达的新数据运行MapReduce,然后在HBase中正确更新搜索索引?如果原始数据保存在HBase中,您可以设计密钥,以便按时间对行进行排序。然后可以使用定义为昨天扫描的最后一行+1的起始行扫描表。你也可以让钥匙从一天开始。由于行是按键排序的,所以您可以轻松地从所需日期的第一行开始,然后在第二天停止 如果将行创建为:Java MapReduce结果的增量更新,java,search,hadoop,mapreduce,hbase,Java,Search,Hadoop,Mapreduce,Hbase,我有一个MapReduce作业,它在HBase中填充搜索索引。此MapReduce作业每天在完整的数据集上运行。有没有办法对上次计算索引后到达的新数据运行MapReduce,然后在HBase中正确更新搜索索引?如果原始数据保存在HBase中,您可以设计密钥,以便按时间对行进行排序。然后可以使用定义为昨天扫描的最后一行+1的起始行扫描表。你也可以让钥匙从一天开始。由于行是按键排序的,所以您可以轻松地从所需日期的第一行开始,然后在第二天停止 如果将行创建为: long currentTimeMS =
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
有一些类似的库可以简化时间计算,使代码更具可读性
你也可以尝试类似的结果。但这假设您插入并且从不更新源行,因为它实际上是在列版本的udpate时间运行的。由于按行键排序,数据可能不紧密,因此速度也可能较慢。总的来说,这似乎不是推荐的方式。但对于快速而肮脏的原型,它是有效的
如果您直接从HDFS扫描数据,那么您可以通过每天将数据保存到不同的目录来实现类似的功能。然后,您只能扫描昨天的目录,而不能扫描其他内容。虽然我们可以使用您的方法从MapReduce作业中读取新数据……但我们如何将结果与以前计算的结果合并?这是我真正的问题…如果这不清楚,我道歉,这取决于你的结果。如果它们真的很大,您可能需要第二个MapReduce作业来组合它们。如果它们很小,您可以更新并将结果保存到某个地方。有关实际数据的更多信息将有助于找出最佳解决方案。在我生成反向索引进行搜索的情况下,使用第二个mapreduce作业实际上可能有效……此新作业可以合并索引您是否考虑使用Sqoop?Sqoop现在支持两种类型的增量udpate:LastValue和Last modified。