以上狀況只適合幾千行數據以及不是不少的列的「小數據」。html
當表擴展爲億萬行及百萬列時,在經過網絡傳遞移動大量的數據致使網絡擁堵,且客戶端須要足夠多內存來處理這麼大量數據的計算操做,另外,客戶端代碼也會變的大而複雜。ios
移動計算比移動數據更划算git
Coprocessor將運算移動到數據所處的節點。github
簡單來講,Coprocessor是一個框架,這個框架可讓你很容易地在Region Server運行你的業務邏輯代碼。web
MapReduce 和 Coprocessor有同樣的操做原則,計算向數據靠攏。數據庫
相似面向切面編程,Coprocessor就像應用Advice,在傳遞請求到最終的目的地以前,經過攔截一個請求後運行相同的代碼。apache
在一個特定的事件發生前或發生後觸發。編程
是一個遠程rpc調用,相似於webservice形式調用,但他不適用xml,而是使用的序列化框架是protobuf(序列化後數據更小).安全
區別:Observer像是個觸發器,到某個條件Region就去執行用戶代碼,用戶從主觀來講是沒法控制的;EndPoint就是遠程調用,用戶能夠在客戶端遠程調用執行本身的代碼。網絡
Observer Coprocessor的使用場景以下:
安全性:在執行Get或Put操做前,經過preGet或prePut方法檢查是否容許該操做;
引用完整性約束:HBase並不直接支持關係型數據庫中的引用完整性約束概念,即一般所說的外鍵。可是咱們可使用Coprocessor加強這種約束。好比根據業務須要,咱們每次寫入user表的同時也要向user_daily_attendance表中插入一條相應的記錄,此時咱們能夠實現一個Coprocessor,在prePut方法中添加相應的代碼實現這種業務需求。
二級索引:可使用Coprocessor來維持一個二級索引。這裏暫不展開,有時間會單獨說明。
Observer在Hbase中主要分爲四類,均繼承Coprocessor接口:
Endpoint容許定義本身的動態RPC協議,用於客戶端與region servers通信。Coprocessor 與region server在相同的進程空間中,所以您能夠在region端定義本身的方法(endpoint),將計算放到region端,減小網絡開銷,經常使用於提高hbase的功能,如:count,sum等。
工做過程以下圖所示過程:
裝載Coprocessor分爲靜態裝載和動態裝載。
動態裝載Coprocessor的一個優點就是不須要重啓HBase。不過動態裝載的Coprocessor只是針對某個表有效。所以,動態裝載的Coprocessor又被稱爲表級Coprocessor。
此外,動態裝載Coprocessor是對錶的一次schema級別的調整,所以在動態裝載Coprocessor時,目標表須要離線。
動態裝載Coprocessor有兩種方式:經過HBase Shell和經過Java API。
Coprocessor是HBase的高級功能,原本是隻爲HBase系統開發人員準備的。由於Coprocessor的代碼直接在RegionServer上運行,並直接接觸數據,這樣就帶來了數據破壞的風險,好比「中間人攻擊(Man-in-the-MiddleAttack,簡稱「MITM攻擊」,見百度詞條)」以及其餘類型的惡意入侵。目前尚未任何機制來屏蔽Coprocessor致使的數據破壞。此外,由於沒有資源隔離,一個即便不是惡意設計的但表現不佳的Coprocessor也會嚴重影響集羣的性能和穩定性。
Phoenix的Salting功能很是有效,但對延遲影響較大,所以若延遲要求較高,那麼Salting則並不合適,因此這裏在主表與索引表中不使用Salting功能,而是採用reverse將主鍵列散列。索引中使用Function Index和Function Index減小查詢延遲。