首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多靶点的HBase扫描

多靶点的HBase扫描
EN

Stack Overflow用户
提问于 2015-10-29 20:31:38
回答 1查看 6K关注 0票数 10

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-02 06:33:57

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

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

  1. 通过FilterList (行键筛选器的列表),
  2. 使用HBase上的SQL连接两个表,如hive、凤凰等。然而,这两种解决方案都是效率低下的。 两者都不能利用距离信息在扫描过程中进行快速转发,这是相当耗时的。如果范围相当大(例如,数百万),尽管连接速度慢,但联接是一个合适的解决方案。 但是,在某些情况下,用户希望指定一小部分要扫描的范围(例如,<1000个范围)。在这种情况下,这两种解决方案都不能提供令人满意的性能。

MultiRowRangeFilter支持这样的usec (扫描多行键范围),它可以从用户构造行键范围。 指定的列表,并在扫描期间执行快速转发。因此,扫描是相当有效的。

代码语言:javascript
复制
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中实现的测试用例

注:然而,这种要求SOLR或ES是最好的方式,在我看来.您可以检查我的用solr回答以获得高层体系结构概述。我建议,由于hbase扫描巨大的数据将非常缓慢。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33424045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档