[英]HBase Scan with Multiple Ranges
我有一個HBase表,我需要從幾個范圍中獲取結果。 例如,我可能需要從1-6行,100-150行等不同范圍獲取數據。我知道對於每次掃描,我都可以定義開始行和停止行。 但是,如果我有6個范圍,則需要掃描6次。 有什么方法可以使我一次掃描或一次RPC從多個范圍獲得結果? 我的HBase版本是0.98。
過濾以支持掃描多個行鍵范圍。 它可以從傳遞的列表構造行鍵范圍,每個區域服務器都可以訪問該行鍵范圍。
僅掃描一個小的行鍵范圍時,HBase效率很高。 如果用戶需要在一次掃描中指定多個行鍵范圍,則典型的解決方案是:
在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中實現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.