HBase之四--(3):hbasehbase分頁查詢


為了廣大技術愛好者學習netty,在這里幫新浪微博@nettying宣傳下他出版的新書 <netty權威指南>
@nettying兄在華為NIO實踐多年,這本書是他的技術和經驗的一個結晶。Netty NIO反應堆線程模型,
零copy,多包,半包處理,如果你對這些感興趣,趕緊關注新浪微博@nettying吧。
讀了這本書,你的技術定會有一個質的飛躍,
也是自己第一次給書寫推薦,呵呵!

最近比較忙,隔了一段時間沒有更新博客了。今天拿點時間來分享下關於hbase分頁查詢的實現思路,自己已經應用了該hbase分頁查詢。
從所周知,hbase通過scan來掃描表,通過startKey,stopKey來確定范圍,hbase官方提供了一個PageFilter來支持一次scan可以返回多少條數據即每頁的行數。假如一頁是10條,這樣是第一頁還好,但是第二頁呢,如果不改變PageFilter的pageSize,那返回的還是第一頁的數據,如果改變pageSize為20,則返回了第一頁10多余的數據,在客戶端要過濾掉,性能不好。那怎么辦呢,方法就是在查詢下一頁時,指定下一頁的startKey,這樣PageFilter每次就不會返回多余的記錄,stopKey可以不用變,那現在問題是,怎么得到下一頁的startKey(即下一頁第一行的rowkey)呢?,有兩種方法來取每一頁的startKey

一  上一頁的最后一行記錄的rowkey作為下一頁的startKey。
二   在每次scan時多取一條記錄,即把下一頁第一條行頁取出來,把該行的rowkey做為下一頁的startKey。

不管用一還是二,都要注意,hbase scan時是包含startKey的,如果是采用第一種,則要在記錄多取一條,排除第一條。第二種頁是多取一條,但是排除最后一條,用來做下一頁的startKey。還有需要注意的是在計算是否有下一頁時,可以根據返回的條數來判斷。

startKey怎么取沒有問題了。但是怎么存儲呢,有同學可能會想到存到session,但是如果你的服務是rest api型的,就沒有session的概念了。那還有兩種選擇:
一 是存到客戶端,讓客戶端每次請求時把startKey再傳回來,這樣需要依賴客戶端,如果客戶端是遠程,或者是開放平台的情況下,可能不合適。
二 存在服務端,存在服務端需要注意並發訪問的情況。比如scan同一個表,一個訪問第2頁,一個訪問第3頁,服務端就需要對每一個table的scan 存每一頁的startKey,需要為同一個查詢條件包含pageSize,因為pageSize不一樣,startKey也會不一樣,
在服務crash情況下,從起后都從第一頁開始。

我自己是采用第二種方案,存在服務端,需要代碼的,可以給我留言,如果你有更好的方案的請分享出來。
注:hbase的分頁一般只提供下一頁,不提供直接最后一頁,

也可以關注我的新浪微博:http://weibo.com/jamvp ,方便交流。。。。

由於網友的需要,現在把Hbase頁面代碼下載鏈接放上。

hbase分頁源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM