本文版權歸mephisto和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做。html
文章是哥(mephisto)寫的,SourceLinkjava
上一篇,咱們講述了HBase的數據模型相關操做的下部分。linux
下面咱們開始介紹HBase的協處理器部分。git
一:介紹
從0.92版本開始,HBase加入了協處理器(coprocessors),利用協處理器,用戶能夠編寫運行在 HBase Server 端的代碼。能夠實現「二級索引」,求和、計數、排序、過濾等server端操做。github
二:類型
分兩種 Observer和Endpoint 。shell
三:觀察者(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 的最大值進一步處理而找到其中的最大值。這樣總體的執行效率就會提升不少。apache
一:說明
咱們編寫一個類,使每次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