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 |