本文主要是從HBase應用程序設計與開發的角度,總結幾種經常使用的性能優化方法。有關HBase系統配置級別的優化,可參考:淘寶Ken Wu同窗的博客。html
下面是本文總結的第四部份內容:數據計算相關的優化方法。前端
Coprocessor運行於HBase RegionServer服務端,各個Regions保持對與其相關的coprocessor實現類的引用,coprocessor類能夠經過RegionServer上classpath中的本地jar或HDFS的classloader進行加載。apache
目前,已提供有幾種coprocessor:api
Coprocessor:提供對於region管理的鉤子,例如region的open/close/split/flush/compact等;性能優化
RegionObserver:提供用於從客戶端監控表相關操做的鉤子,例如表的get/put/scan/delete等;函數
Endpoint:提供能夠在region上執行任意函數的命令觸發器。一個使用例子是RegionServer端的列聚合,這裏有代碼示例。oop
以上只是有關coprocessor的一些基本介紹,本人沒有對其實際使用的經驗,對它的可用性和性能數據不得而知。感興趣的同窗能夠嘗試一下,歡迎討論。性能
HBase自己能夠看做是一個能夠水平擴展的Key-Value存儲系統,可是其自己的計算能力有限(Coprocessor能夠提供必定的服務端計算),所以,使用HBase時,每每須要從寫端或者讀端進行計算,而後將最終的計算結果返回給調用者。舉兩個簡單的例子:優化
PV計算:經過在HBase寫端內存中,累加計數,維護PV值的更新,同時爲了作到持久化,按期(如1秒)將PV計算結果同步到HBase中,這樣查詢端最多會有1秒鐘的延遲,能看到秒級延遲的PV結果。spa
分鐘PV計算:與上面提到的PV計算方法相結合,每分鐘將當前的累計PV值,按照rowkey + minute做爲新的rowkey寫入HBase中,而後在查詢端經過scan獲得當天各個分鐘之前的累計PV值,而後順次將先後兩分鐘的累計PV值相 減,就獲得了當前一分鐘內的PV值,從而最終也就獲得當天各個分鐘內的PV值。
對於UV的計算,就是個去重計算的例子。分兩種狀況:
若是內存能夠容納,那麼能夠在Hash表中維護全部已經存在的UV標識,每當新來一個標識時,經過快速查找Hash肯定是不是一個新的UV,如果 則UV值加1,不然UV值不變。另外,爲了作到持久化或提供給查詢接口使用,能夠按期(如1秒)將UV計算結果同步到HBase中。
若是內存不能容納,能夠考慮採用Bloom Filter來實現,從而儘量的減小內存的佔用狀況。除了UV的計算外,判斷URL是否存在也是個典型的應用場景。
若是對於響應時間要求比較苛刻的狀況(如單次http請求要在毫秒級時間內返回),我的以爲讀端不宜作過多複雜的計算邏輯,儘可能作到讀端功能單一 化:即從HBase RegionServer讀到數據(scan或get方式)後,按照數據格式進行簡單的拼接,直接返回給前端使用。固然,若是對於響應時間要求通常,或者 業務特色須要,也能夠在讀端進行一些計算邏輯。
做爲一個Key-Value存儲系統,HBase並非萬能的,它有本身獨特的地方。所以,基於它來作應用時,咱們每每須要從多方面進行優化改進 (表設計、讀表操做、寫表操做、數據計算等),有時甚至還須要從系統級對HBase進行配置調優,更甚至能夠對HBase自己進行優化。這屬於不一樣的層次 範疇。
總之,歸納來說,對系統進行優化時,首先定位到影響你的程序運行性能的瓶頸之處,而後有的放矢進行鍼對行的優化。若是優化後知足你的指望,那麼就能夠中止優化;不然繼續尋找新的瓶頸之處,開始新的優化,直到知足性能要求。