多范围hbase扫描

uhry853o  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(731)

我有一个hbase表,需要从多个范围得到结果。例如,我可能需要从不同的范围获取数据,如第1-6行、100-150行,。。。。。我知道每次扫描,我都可以定义起始行和停止行。但是如果我有6个范围,我需要扫描6次。有没有办法,我可以得到结果,从多个范围只是从一个扫描或从一个rpc?我的hbase版本是0.98。

ny6fqffe

ny6fqffe1#

筛选以支持扫描多行键范围。它可以从每个区域服务器可以访问的传递列表中构造行键范围。
当只扫描一个小的行键范围时,hbase是非常有效的。如果用户需要在一次扫描中指定多个行键范围,典型的解决方案是:
通过filterlist,它是行键过滤器的列表,
使用hbase上的sql层连接两个表,例如hive、phoenix等。但是,这两种解决方案都效率低下。
两者都不能利用距离信息在扫描过程中进行快速转发,这非常耗时。如果范围的数目很大(例如数百万),join是一个合适的解决方案,尽管它很慢。
但是,在有些情况下,用户希望指定少量要扫描的范围(例如<1000个范围)。在这种情况下,两种解决方案都不能提供令人满意的性能。
multirowrangefilter就是支持这样的usec-ase(scan multiple row key ranges),它可以根据用户的需要构造行键范围
指定列表并在扫描期间执行快速转发。因此,扫描将是相当有效的。

  1. package chengchen;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.hbase.HBaseConfiguration;
  6. import org.apache.hadoop.hbase.client.HTable;
  7. import org.apache.hadoop.hbase.client.Result;
  8. import org.apache.hadoop.hbase.client.ResultScanner;
  9. import org.apache.hadoop.hbase.client.Scan;
  10. import org.apache.hadoop.hbase.filter.Filter;
  11. import org.apache.hadoop.hbase.filter.MultiRowRangeFilter;
  12. import org.apache.hadoop.hbase.filter.MultiRowRangeFilter.RowKeyRange;
  13. import org.apache.hadoop.hbase.util.Bytes;
  14. public class MultiRowRangeFilterTest {
  15. public static void main(String[] args) throws Exception {
  16. if (args.length < 1) {
  17. throw new Exception("Table name not specified.");
  18. }
  19. Configuration conf = HBaseConfiguration.create();
  20. HTable table = new HTable(conf, args[0]);
  21. TimeCounter executeTimer = new TimeCounter();
  22. executeTimer.begin();
  23. executeTimer.enter();
  24. Scan scan = new Scan();
  25. List<RowKeyRange> ranges = new ArrayList<RowKeyRange>();
  26. ranges.add(new RowKeyRange(Bytes.toBytes("001"), Bytes.toBytes("002")));
  27. ranges.add(new RowKeyRange(Bytes.toBytes("003"), Bytes.toBytes("004")));
  28. ranges.add(new RowKeyRange(Bytes.toBytes("005"), Bytes.toBytes("006")));
  29. Filter filter = new MultiRowRangeFilter(ranges);
  30. scan.setFilter(filter);
  31. int count = 0;
  32. ResultScanner scanner = table.getScanner(scan);
  33. Result r = scanner.next();
  34. while (r != null) {
  35. count++;
  36. r = scanner.next();
  37. }
  38. System.out
  39. .println("++ Scanning finished with count : " + count + " ++");
  40. scanner.close();
  41. }
  42. }

请参阅这个用java实现的测试用例

注:然而,在我看来,这种需求解决方案是最好的方式。。。您可以通过solr查看我的答案,了解高层体系结构概述。我建议,由于hbase扫描巨大的数据将是非常缓慢的。

展开查看全部

相关问题