具有多个范围的HBase扫描

具有多个范围的HBase扫描,hbase,database-scan,Hbase,Database Scan,我有一个HBase表,需要从多个范围获得结果。例如,我可能需要从不同的范围获取数据,如第1-6行、第100-150行等,。。。。。我知道,对于每次扫描,我可以定义开始行和停止行。但是如果我有6个范围,我需要扫描6次。是否有任何方法可以从一次扫描或一次RPC中获得多个范围的结果?我的HBase版本是0.98。过滤器支持扫描多行键范围。它可以从 每个区域服务器都可以访问的已通过列表 当只扫描一个小行键范围时,HBase非常有效。如果用户需要指定 在一次扫描中有多个行键范围,典型的解决方案是: 通过过

我有一个HBase表,需要从多个范围获得结果。例如,我可能需要从不同的范围获取数据,如第1-6行、第100-150行等,。。。。。我知道,对于每次扫描,我可以定义开始行和停止行。但是如果我有6个范围,我需要扫描6次。是否有任何方法可以从一次扫描或一次RPC中获得多个范围的结果?我的HBase版本是0.98。

过滤器支持扫描多行键范围。它可以从 每个区域服务器都可以访问的已通过列表

当只扫描一个小行键范围时,HBase非常有效。如果用户需要指定 在一次扫描中有多个行键范围,典型的解决方案是:

  • 通过过滤器列表,它是一个 行键筛选器的列表
  • 使用HBase上的SQL层连接两个表,如配置单元, 然而,这两种解决方案都是低效的

    它们都不能利用范围信息在扫描期间执行快速转发,这相当耗时。如果范围的数量 规模相当大(如百万),join是一个合适的解决方案,尽管速度很慢。
    然而,有
    用户希望指定少量要扫描的范围的情况(例如,Hbase 2具有允许设置多个范围的MultiRowRanger。如果范围较小,则多次扫描查询也会更快。MultiRowRanger是否仅发送一个RPC用于多个范围?如果无法使用MultiRowRange筛选器,则多次扫描是您的最佳选择,尤其是如果范围之间的键数较大。我更改了Hbase 2。)最后使用MultiRowRangeFilter。Rahul和kostya,你们中有谁能在答案中发布MultiRowRangeFilter吗?我已经接受了你们的建议,用它来解决我的问题。顺便说一句,如果你们不介意的话,你们能提一下我的问题吗?我需要一些声誉,以便有权对其他人的问题发表评论。嗨,拉姆,你们的问题是什么意思最终声明。由于不清楚,您能否澄清一下。您的意思是Solr或ES将是解决此问题的更好的解决方案,如果是,您能否添加一个关于如何工作的高级体系结构视图?是的,根据我的经验,Solr与hbase配合使用很好。用于从hbase查询数据,也可以发布到UI仪表板。因为estion与solr无关,我想不添加它。@eboni:我更新了我的答案。.因为solr是不同的上下文,所以我不能在这里详细说明。我添加了上面我答案的链接
    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();
    
    
        }
    
    }