gpt4 book ai didi

具有多个范围的 HBase 扫描

转载 作者:行者123 更新时间:2023-12-04 08:33:36 38 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

  • MultiRowRangeFilter is to support such usec ase (scan multiple row key ranges), which can construct the row key ranges from user
    specified list and perform fast-forwarding during scan. Thus, the scan will be quite efficient.


    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 扫描大量数据会非常慢。

    关于具有多个范围的 HBase 扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424045/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com