簡體   English   中英

多種范圍的HBase掃描

[英]HBase Scan with Multiple Ranges

我有一個HBase表,我需要從幾個范圍中獲取結果。 例如,我可能需要從1-6行,100-150行等不同范圍獲取數據。我知道對於每次掃描,我都可以定義開始行和停止行。 但是,如果我有6個范圍,則需要掃描6次。 有什么方法可以使我一次掃描或一次RPC從多個范圍獲得結果? 我的HBase版本是0.98。

過濾以支持掃描多個行鍵范圍。 它可以從傳遞的列表構造行鍵范圍,每個區域服務器都可以訪問該行鍵范圍。

僅掃描一個小的行鍵范圍時,HBase效率很高。 如果用戶需要在一次掃描中指定多個行鍵范圍,則典型的解決方案是:

  1. 通過FilterList(它是行鍵過濾器的列表),
  2. 在HBase上使用SQL層來連接兩個表,例如hive,phoenix等。但是,這兩種解決方案都效率不高。

    它們都不能利用范圍信息在掃描期間執行快速轉發,這非常耗時。 如果范圍的數量很大(例如,數百萬個),盡管連接很慢,但join是一個合適的解決方案。
    但是,在某些情況下,用戶希望指定少量掃描范圍(例如<1000個范圍)。 在這種情況下,兩種解決方案都無法提供令人滿意的性能。

MultiRowRangeFilter支持這種用例(掃描多個行鍵范圍),可以從用戶構造行鍵范圍
指定的列表並在掃描過程中執行快速轉發。 因此,掃描將非常有效。

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掃描大量數據將非常慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM