標籤:

hbase 基於rowkey 模糊查詢 如何做效率高?

我是做卡口系統,rowkey設計為時間_車牌,例如20150609142033_京QXXXXX,掃時間範圍簡單,start_rowkey,end_rowkey很快,如果想模糊查詢車牌就不知道怎樣才能快,單獨建一個車牌為rowkey的表可以么,這樣的話如何查詢才能快


哈哈哈,恰好我也在做一個類似的問題;hbase權威指南133頁,關於rowkey有一個內建的過濾器:

Scan scan = new Scan();

Filter filter = new RowFilter(CompareOp.EQUAL,new RegexStringComparator(".*京Q00"));

scan.setFilter(filter);

ResultScanner scanner;

try {

scanner = table.getScanner(scan);

for(Result res:scanner)

{

System.out.println(res);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

上面這段代碼應該能夠解決你的問題啦,enjoy it.

——————————————————分割線——————————————————

更新於2015.12.20

@周工 因為是對rowkey的過濾,所以你提到的這個問題其實沒有那麼誇張,你可以把rowkey理解為hbase的索引

下圖1.1(hbase查詢性能圖)可以很好地說明這個問題。hbase在對key值進行過濾尤其是rowkey(行鍵)進行過濾的時候,性能是最優的。

雖然你沒有對非常慢進行說明,我就大概猜一下千萬級別大於1s算非常慢的話,之前在進行rowkey過濾操作的時候,對應200w數據量,scan過程(即完成匹配消耗時間)的耗時在100ms之內,且是非線性增長的(數據越大耗時增長越緩慢),只是根據匹配內容數量,會有讀取數據耗時(可以分頁進行輸出)

我在前一段時間對hbase的讀寫性能進行過測試,雖然沒有測試各個篩選器的效率,但是可以對hbase對rowkey的讀取數據耗時有一個直觀的感受,現在貼出來在下面,希望對你有幫助(知乎不能上傳表格):

根據測試數據可知:

1. 當讀取的數據量小於50000條時,hbase的數據讀取都在毫秒級別,此時的時間消耗大多用於程序啟停的消耗。

2. 在讀取數據時,可通過設定單次從hbase取到內存的數據量大小,從而提高讀取的效率,當數據量特別大的時候,cach值得設定對讀取速率有很大的影響,通常將cach值設定為數據同一數量級時能夠獲得較好的效率。

public static ResultScanner scanAll(HTable table,int num) throws IOException{

Scan s=new Scan();

s.setCaching(int cach);//設置hbase單次獲取到內存的數據條數

ResultScanner rs=table.getScanner(s);

return rs;

}

3. 當使用scanner函數進行整張表或者大批量的查詢時,合理的設置「int cach」可大量減少查詢時間。

——————————————————分割線——————————————————

綜上,由於hbase對rowkey的索引機制,即使在過濾大量數據時,對rowkey相關的操作也依然非常快速,瓶頸在數據讀出上。

但是,如果是要對value進行過濾時,效率就會出現你說的非常慢了,至於對value的過濾使用Apache提供的別的搜索工具進行集成就好,比如Lucene。

以上。


用filter

HBase有提供好幾款了

按你的需求可以嘗試下FuzzyRowFilter(好像是這個名字

如果都滿足不了 可以自己寫一個filter


這個設計有嚴重缺陷,時間為2015***,基本上一年的熱點都在一個region server上 對集群的查詢會非常慢,數據量大的話會拖垮集群。

要遵循rowkey設計的幾個原則:散列性、唯一性、長度不宜過長


rowkey設計為時間_車牌不會有寫入熱點嗎。。。。。同一時間都往同個region插了


首先如前面幾位所言,你的rowkey設計有熱點的問題。

根據你的需求可以使用hbase的二級索引。用法請百度


不錯~~~~~~~~~~


推薦閱讀:

mongodb,redis,hbase 三者都是nosql資料庫,他們的最大區別和不同定位是什麼?
為什麼說HBase是列式資料庫?
HBase讀性能怎麼樣?
從百萬級別數據的分析角度,Mysql,Mongodb,Hbase如何選擇?
怎麼看hadoop的源碼,求大神指教?

TAG:HBase |