具有多个范围的HBase扫描

时间:2015-10-29 20:31:39

标签: hbase database-scan

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

1 个答案:

答案 0 :(得分:4)

过滤以支持扫描多行键范围。它可以构造行键范围   传递列表,每个区域服务器都可以访问。

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

  1. 通过FilterList,它是一个 行键列表过滤器,
  2. 使用HBase上的SQL层连接两个表,例如hive, 凤凰等。然而,这两种解决方案效率都很低。

    他们都不能利用范围信息在扫描期间执行快速转发,这非常耗时。如果范围的数量 相当大(例如数百万),加入是一个合适的解决方案虽然很慢 但是,有 用户想要指定要扫描的少量范围的情况(例如,<1000范围)。都 在这种情况下,解决方案无法提供令人满意的性能。

  3.   

    MultiRowRangeFilter是支持这样的usec ase(扫描多行   键范围),可以构造用户
    的行键范围   指定列表并在扫描期间执行快进。因此,扫描   会很有效率的。

    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();
    
    
        }
    
    }
    

    请参阅此test case以了解在java中的实现

    注意:但是,在我看来,这种要求SOLR或ES是最好的方式......您可以查看我的answer with solr以获取高级架构概述。我建议,因为hbase扫描大量数据会非常慢。