Hbase0.98.4中部署用戶(hù)自定義的ObserverCoprocessor

    Hbase自0.92之后開(kāi)始支持Coprocessor(協(xié)處理器),旨在使用戶(hù)可以將自己的代碼放在regionserver上來(lái)運(yùn)行,即將計(jì)算程序移動(dòng)到數(shù)據(jù)所在的位置進(jìn)行運(yùn)算。這一點(diǎn)與MapReduce的思想一致。Hbase的Coprocess分為observer和endpoint兩大類(lèi)。簡(jiǎn)單說(shuō),observer相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的觸發(fā)器,而endpoint則相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。關(guān)于HBase Coprocessor的介紹網(wǎng)上有很多的文檔,由于我也是剛剛學(xué)習(xí),從很多好人貢獻(xiàn)的文檔上了解了很多。

十余年的甘南網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整甘南建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“甘南網(wǎng)站設(shè)計(jì)”,“甘南網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

    這里記錄一下自己在一個(gè)完全分布式系統(tǒng)上部署自定義的Coprocessor的過(guò)程,本文會(huì)介紹兩種部署的方法:一種是在hbase-site.xml中配置;第二種是使用表描述符來(lái)配置(alter);前者會(huì)被所有的表的所有的region加載,而后者只會(huì)對(duì)指定的表的所有region加載。本文會(huì)結(jié)合自己的實(shí)驗(yàn)過(guò)程指出哪些地方為易錯(cuò)點(diǎn)。

    首先,還是先來(lái)看下環(huán)境:

        hadoop1.updb.com    192.168.0.101    Role:master

        hadoop2.updb.com    192.168.0.102    Role:regionserver

        hadoop3.updb.com    192.168.0.103    Role:regionserver

        hadoop4.updb.com    192.168.0.104    Role:regionserver

        hadoop5.updb.com    192.168.0.105    Role:regionserver

    首先編碼自定義的Coprocessor,該段代碼摘自《Hbase權(quán)威指南》,只是修改了package的名字:

/**
 * coprocessor
 * 當(dāng)用戶(hù)在使用get命令從表中取特定的row時(shí),就會(huì)觸發(fā)這個(gè)自定義的observer coprocessor
 * 觸發(fā)條件是用戶(hù)使用get指定的rowkey與程序中指定的FIXED_ROW一致為@@@GETTIME@@@時(shí)
 * 觸發(fā)后的操作是程序會(huì)在服務(wù)端生成一個(gè)keyvalue實(shí)例,并將這個(gè)實(shí)例返回給客戶(hù)端。這個(gè)kv實(shí)例是以
 * @@@GETTIME@@@為rowkey,列族和列標(biāo)識(shí)符均為@@@GETTIME@@@,列值為服務(wù)器端的時(shí)間
 */

package org.apache.hbase.kora.coprocessor;

import java.io.IOException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
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.HRegion;
import org.apache.hadoop.hbase.util.Bytes;

public class RegionObserverExample extends BaseRegionObserver {
    public static final Log LOG = LogFactory.getLog(HRegion.class);
    public static final byte[] FIXED_ROW = Bytes.toBytes("@@@GETTIME@@@");

    @Override
    public void preGet(ObserverContext<RegionCoprocessorEnvironment> c,
            Get get, List<KeyValue> result) throws IOException {
        LOG.debug("Got preGet for row: " + Bytes.toStringBinary(get.getRow()));
        
        if (Bytes.equals(get.getRow(), FIXED_ROW)) {
            KeyValue kv = new KeyValue(get.getRow(), FIXED_ROW, FIXED_ROW,
                    Bytes.toBytes(System.currentTimeMillis()));
            LOG.debug("Had a match, adding fake kv: " + kv);
            result.add(kv);
        }
    }
}

    編碼完成后需要將該類(lèi)編譯并打成jar包,類(lèi)名上右擊--Export,彈出如下窗口

Hbase0.98.4中部署用戶(hù)自定義的Observer Coprocessor

    選擇JAR file,然后Next,出現(xiàn)如下窗口

Hbase0.98.4中部署用戶(hù)自定義的Observer Coprocessor

    指定jar文件的保存路徑,然后finish,就完成了RegionObserverExample類(lèi)的編譯和打包,接下來(lái)就需要將打好的jar文件使用ftp的方式上傳到hbase集群的master服務(wù)器上,這里為hadoop1。

## 已經(jīng)上傳到hadoop1上
[grid@hadoop1 ~]$ ls /var/ftp/pub/RegionObserverExample.jar 
/var/ftp/pub/RegionObserverExample.jar
## 由于是完全分布式系統(tǒng),為了方便管理,我們將jar包存放到hadoop hdfs的根目錄下的jars目錄下
[grid@hadoop1 ~]$ hdfs dfs -put /var/ftp/pub/RegionObserverExample.jar /jars
## OK,驗(yàn)證已經(jīng)上傳成功
[grid@hadoop1 ~]$ hdfs dfs -ls /jars                                        
Found 1 items
-rw-r--r--   4 grid supergroup       3884 2014-11-15 04:46 /jars/RegionObserverExample.jar

    然后需要將打好的jar包放到hbase安裝目錄下的lib目錄下,并修改hbase-site.xml配置文件

## cp jar包到hbase安裝目錄下的lib目錄,所有節(jié)點(diǎn)上都做這樣的操作
[grid@hadoop1 ~]$ cp /var/ftp/pub/RegionObserverExample.jar /opt/hbase-0.98.4-hadoop2/lib/

## 然后修改hbase-site.xml文件,添加一個(gè)選項(xiàng)
    <!-- 這里要注意value中一定要寫(xiě)完整的類(lèi)名(即把包名寫(xiě)全),否則報(bào)ClassNotFound錯(cuò) -->
    <property>
        <name>hbase.coprocessor.region.classes</name>
        <value>org.apache.hbase.kora.coprocessor.RegionObserverExample</value>
    </property>

    在master上修改配置文件完成之后,將修改后的文件scp到其他個(gè)regionserver上,然后重啟hbase使配置生效。重啟之后來(lái)看是否能夠正確的觸發(fā)

## 使用get命令從kora表中取rowkey為@@@GETTIME@@@的行
hbase(main):014:0> get 'kora', '@@@GETTIME@@@'
COLUMN                   CELL                                                                
 @@@GETTIME@@@:@@@GETTIM timestamp=9223372036854775807, value=\x00\x00\x01I\xB0@\xA0\xE0     
 E@@@                                                                                        
1 row(s) in 0.0420 seconds
## 將列值轉(zhuǎn)化為uninx 時(shí)間
hbase(main):015:0> Time.at(Bytes.toLong("\x00\x00\x01I\xB0\x0BZ\x0B".to_java_bytes)/ 1000)
=> Sat Nov 15 04:42:54 +0800 2014    
## 從上面的測(cè)試中看出,我們自定義的Coprocessor已經(jīng)成功的部署到分布式系統(tǒng)中了。

    需要留意的是在hbase-site.xml配置的Coprocessor默認(rèn)是會(huì)被每張表的每個(gè)region加載。如果只想要某個(gè)表使用這個(gè)observer coprocessor,就需要使用表描述符的加載方式,這種方式同樣的需要拷貝jar包到hbase安裝目錄下的lib目錄中去,與上面不同的是不用在hbase-site.xml中設(shè)置Coprocessor,而是使用alter來(lái)把Coprocessor與表綁定。如下

## cp jar包到hbase安裝目錄下的lib目錄,所有節(jié)點(diǎn)上都做這樣的操作
[grid@hadoop1 ~]$ cp /var/ftp/pub/RegionObserverExample.jar /opt/hbase-0.98.4-hadoop2/lib/

## 注釋掉hbase-site.xml中的Coprocessor的配置
[grid@hadoop1 ~]$ tail -7  /opt/hbase-0.98.4-hadoop2/conf/hbase-site.xml 
<!--
    <property>
        <name>hbase.coprocessor.region.classes</name>
        <value>org.apache.hbase.kora.coprocessor.RegionObserverExample</value>
    </property>
 -->
</configuration>

    在hbase shell中使用alter命令來(lái)為kora表來(lái)設(shè)定Coprocessor

## 格式:[coprocessor jar file location] | class name | [priority] | [arguments]
## 列子:hbase> alter 't1',
##       'coprocessor'=>'hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2'
## 由于一定設(shè)置了classpath,所以可以忽略jar file location,如下:
hbase(main):101:0> alter 'kora',
hbase(main):102:0* 'coprocessor' => '|org.apache.hbase.kora.coprocessor.RegionObserverExample|'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.5670 seconds

    設(shè)置成功,decribe下表

hbase(main):103:0> describe 'kora'
DESCRIPTION                                                                                           ENABLED                                                
 'kora', {TABLE_ATTRIBUTES => {coprocessor$1 => '|org.apache.hbase.kora.coprocessor.RegionObserverExa true                                                   
 mple|'}, {NAME => 'project', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE                                                         
 => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_                                                        
 CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}                                                                         
1 row(s) in 0.0580 seconds

    ok,已經(jīng)設(shè)置成功,下面來(lái)測(cè)試一下

## kora表,指定了Coprocessor
hbase(main):104:0> get 'kora', '@@@GETTIME@@@'
COLUMN                                   CELL                                                                                                                
 @@@GETTIME@@@:@@@GETTIME@@@             timestamp=9223372036854775807, value=\x00\x00\x01I\xB0\x985W                                                        
1 row(s) in 0.0360 seconds
## testtable,沒(méi)有指定Coprocessor
hbase(main):105:0> get 'testtable', '@@@GETTIME@@@'
COLUMN                                   CELL                                                                                                                
0 row(s) in 0.0180 seconds

    需要注意的是,Coprocessor的優(yōu)先級(jí)有SYSTEM和USER兩種,SYSTEM優(yōu)先于USER加載。使用表描述符設(shè)置Coprocessor時(shí),不要設(shè)置優(yōu)先級(jí)這一項(xiàng),否則無(wú)法成功觸發(fā),如

'coprocessor' => '|org.apache.hbase.kora.coprocessor.RegionObserverExample|USER|'

    雖然也能成功設(shè)置Coprocessor,但是測(cè)試時(shí)是無(wú)法觸發(fā)的,在上述環(huán)境中親自測(cè)試過(guò)的,而且hbase幫助文檔中優(yōu)先級(jí)這個(gè)項(xiàng)用戶(hù)不是必輸項(xiàng),只有類(lèi)名是必輸項(xiàng)。我們可以根據(jù)自己的需求來(lái)選擇使用哪種方式來(lái)配置自己的Coprocessor。

    

新聞標(biāo)題:Hbase0.98.4中部署用戶(hù)自定義的ObserverCoprocessor
本文路徑:http://bm7419.com/article22/jjegjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司用戶(hù)體驗(yàn)、做網(wǎng)站自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司