閱讀目錄
本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。
文章是哥(mephisto)寫的,SourceLink
序
上一篇,我們講述了HBase的資料模型相關操作的下部分。
下面我們開始介紹HBase的協處理器部分。
介紹
一:介紹
從0.92版本開始,HBase加入了協處理器(coprocessors),利用協處理器,使用者可以編寫執行在 HBase Server 端的程式碼。可以實現“二級索引”,求和、計數、排序、過濾等server端操作。
二:型別
分兩種 Observer和Endpoint 。
三:觀察者(Observer)
Observer 協處理器類似於傳統資料庫中的觸發器,當發生某些事件的時候這類協處理器會被 Server 端呼叫。Observer Coprocessor 就是一些散佈在 HBase Server 端程式碼中的 hook 鉤子,在固定的事件發生時被呼叫。比如:put 操作之前有鉤子函式 prePut,該函式在 put 操作執行前會被 Region Server 呼叫;在 put 操作之後則有 postPut 鉤子函式
四:終端(Endpoint)
Endpoint 協處理器類似傳統資料庫中的儲存過程,客戶端可以呼叫這些 Endpoint 協處理器執行一段 Server 端程式碼,並將 Server 端程式碼的結果返回給客戶端進一步處理,最常見的用法就是進行聚集操作。如果沒有協處理器,當使用者需要找出一張表中的最大資料,即 max 聚合操作,就必須進行全表掃描,在客戶端程式碼內遍歷掃描結果,並執行求最大值的操作。這樣的方法無法利用底層叢集的併發能力,而將所有計算都集中到 Client 端統一執行,勢必效率低下。利用 Coprocessor,使用者可以將求最大值的程式碼部署到 HBase Server 端,HBase 將利用底層 cluster 的多個節點併發執行求最大值的操作。即在每個 Region 範圍內執行求最大值的程式碼,將每個 Region 的最大值在 Region Server 端計算出,僅僅將該 max 值返回給客戶端。在客戶端進一步將多個 Region 的最大值進一步處理而找到其中的最大值。這樣整體的執行效率就會提高很多。
Observer操作
一:說明
我們編寫一個類,使每次put進來的資料都列印日誌,用來測試observer coprocessor的機制。
二:編寫協處理器工程
View Codepackage com.du.hbase.coprocessor; import java.io.IOException; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellScanner; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.client.Durability; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.log4j.Logger; /** * @FileName : (CP_writelog.java) * * @description :協處理器寫日誌 * @author : Frank.Du * @version : Version No.1 * @create : 2016年12月8日 下午6:52:31 * @modify : 2016年12月8日 下午6:52:31 * @copyright : */ public class CP_writelog extends BaseRegionObserver { private static final Logger logger = Logger.getLogger(CP_writelog.class); @Override public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException { writeLog(put); super.prePut(e, put, edit, durability); } /** * 寫log * * @param put * @throws IOException */ private void writeLog(Put put) { try { logger.info("writehdfs : is begining"); CellScanner cellScanner = put.cellScanner(); StringBuilder sb = new StringBuilder(); while (cellScanner.advance()) { Cell current = cellScanner.current(); String fieldName = new String(CellUtil.cloneQualifier(current), "utf-8"); String fieldValue = new String(CellUtil.cloneValue(current), "utf-8"); String fieldRow = new String(CellUtil.cloneRow(current), "utf-8"); String fieldFamilyCell = new String( CellUtil.cloneFamily(current), "utf-8"); String info = "fieldName:" + fieldName + " fieldValue:" + fieldValue + " fieldRow:" + fieldRow + " fieldFamilyCell:" + fieldFamilyCell; sb.append(info); } logger.info("writehdfs : info:" + sb.toString()); } catch (IOException e) { logger.error(e.getMessage()); } } }三:使用maven打包程式
由於打包的jar包名字太長,將jar包改成hbase-cp.jar
四:將檔案上傳到linux本地系統
put 'table1','row1','cf3:a','aa2'通過xshell工具,將協處理程式上傳到linux伺服器下。
五:將本地檔案上傳到hdfs檔案系統中
sudo -uhdfs hadoop fs -copyFromLocal hbase-cp.jar /user/hbase-cp.jar六:進入hbase shell
hbase shell七:檢視table1的表資訊
desc 'table1'由此可見,該表沒有設定協處理器。
八:新增協處理器
alter 'table1','coprocessor'=>'hdfs://master4:8020/user/hbase-cp.jar|com.du.hbase.coprocessor.CP_writelog|1001'中間一段為協處理的jar包和類名
最後一段數字為權值,權值越小,協處理器的執行越靠前九:檢視table1的表資訊
desc 'table1'
可以看到該表已經設定了協處理器。
十:檢視該表所在RegionServer
開啟網頁http://master4:16010/master-status
點選進去
可以看到regionserver是master4。
十一:檢視日誌
進入對應regionserver
cd /var/log/hbase/檢視日誌
tail -2000f hbase-hbase-regionserver-master4.log
十二:插入資料
put 'table1','row11','cf1:a','v11'在插入資料的過程中。我們同時看下日誌
可以看到我們插入的資料,在日誌裡列印出來了。十三:刪除協處理器
alter 'table1',METHOD=>'table_att_unset' ,NAME=>'coprocessor$1'
--------------------------------------------------------------------
到此,本章節的內容講述完畢。
示例下載
github:https://github.com/sinodzh/HadoopExample/tree/master/2016/hbase
系列索引
本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。
文章是哥(mephisto)寫的,SourceLink