我有一个hbase表,需要从多个范围得到结果。例如,我可能需要从不同的范围获取数据,如第1-6行、100-150行,。。。。。我知道每次扫描,我都可以定义起始行和停止行。但是如果我有6个范围,我需要扫描6次。有没有办法,我可以得到结果,从多个范围只是从一个扫描或从一个rpc?我的hbase版本是0.98。
ny6fqffe1#
筛选以支持扫描多行键范围。它可以从每个区域服务器可以访问的传递列表中构造行键范围。当只扫描一个小的行键范围时,hbase是非常有效的。如果用户需要在一次扫描中指定多个行键范围,典型的解决方案是:通过filterlist,它是行键过滤器的列表,使用hbase上的sql层连接两个表,例如hive、phoenix等。但是,这两种解决方案都效率低下。两者都不能利用距离信息在扫描过程中进行快速转发,这非常耗时。如果范围的数目很大(例如数百万),join是一个合适的解决方案,尽管它很慢。但是,在有些情况下,用户希望指定少量要扫描的范围(例如<1000个范围)。在这种情况下,两种解决方案都不能提供令人满意的性能。multirowrangefilter就是支持这样的usec-ase(scan multiple row key ranges),它可以根据用户的需要构造行键范围指定列表并在扫描期间执行快速转发。因此,扫描将是相当有效的。
package chengchen; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.MultiRowRangeFilter; import org.apache.hadoop.hbase.filter.MultiRowRangeFilter.RowKeyRange; import org.apache.hadoop.hbase.util.Bytes; public class MultiRowRangeFilterTest { public static void main(String[] args) throws Exception { if (args.length < 1) { throw new Exception("Table name not specified."); } Configuration conf = HBaseConfiguration.create(); HTable table = new HTable(conf, args[0]); TimeCounter executeTimer = new TimeCounter(); executeTimer.begin(); executeTimer.enter(); Scan scan = new Scan(); List<RowKeyRange> ranges = new ArrayList<RowKeyRange>(); ranges.add(new RowKeyRange(Bytes.toBytes("001"), Bytes.toBytes("002"))); ranges.add(new RowKeyRange(Bytes.toBytes("003"), Bytes.toBytes("004"))); ranges.add(new RowKeyRange(Bytes.toBytes("005"), Bytes.toBytes("006"))); Filter filter = new MultiRowRangeFilter(ranges); scan.setFilter(filter); int count = 0; ResultScanner scanner = table.getScanner(scan); Result r = scanner.next(); while (r != null) { count++; r = scanner.next(); } System.out .println("++ Scanning finished with count : " + count + " ++"); scanner.close(); } }
请参阅这个用java实现的测试用例
1条答案
按热度按时间ny6fqffe1#
筛选以支持扫描多行键范围。它可以从每个区域服务器可以访问的传递列表中构造行键范围。
当只扫描一个小的行键范围时,hbase是非常有效的。如果用户需要在一次扫描中指定多个行键范围,典型的解决方案是:
通过filterlist,它是行键过滤器的列表,
使用hbase上的sql层连接两个表,例如hive、phoenix等。但是,这两种解决方案都效率低下。
两者都不能利用距离信息在扫描过程中进行快速转发,这非常耗时。如果范围的数目很大(例如数百万),join是一个合适的解决方案,尽管它很慢。
但是,在有些情况下,用户希望指定少量要扫描的范围(例如<1000个范围)。在这种情况下,两种解决方案都不能提供令人满意的性能。
multirowrangefilter就是支持这样的usec-ase(scan multiple row key ranges),它可以根据用户的需要构造行键范围
指定列表并在扫描期间执行快速转发。因此,扫描将是相当有效的。
请参阅这个用java实现的测试用例
注:然而,在我看来,这种需求解决方案是最好的方式。。。您可以通过solr查看我的答案,了解高层体系结构概述。我建议,由于hbase扫描巨大的数据将是非常缓慢的。