從零自學Hadoop(22):HBase協處理器

sinodzh發表於2016-12-14

閱讀目錄

本文版權歸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的機制。

二:編寫協處理器工程

package 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());
        }

    }

}
View Code

三:使用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

系列索引

  【源】從零自學Hadoop系列索引

 

 

 

 

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

文章是哥(mephisto)寫的,SourceLink

 

相關文章