1. 程式人生 > >HBase總結(11)--觀察者模式

HBase總結(11)--觀察者模式

一、介紹

上一屆簡單介紹了協處理器的主要功能以及相應的特點,但沒有對寫出器的具體內容作出詳細的解釋。這篇文章解釋了協處理器的觀察者模式。觀察者模式就是提供了一個觸發器,使用者通過整合相應的類(BaseRegionObverser等),重寫其中想要實現的方法,然後將協處理器載入到表中,這是表就會通過協處理器“監聽”使用者預先設定的動作,一旦該動作被執行,使用者所寫的鉤子函式就被觸發,然後就能實現相應的功能。

二、詳解

1、觀察者模式介紹

觀察者模式提供了一種類似於觸發器的功能,即在使用者執行某些已經被指定的動作時,會觸發觀察者模式,並執行使用者已經提前設定在觀察者模式中的程式碼。

觀察則模式主要分為三種類型:region級別的觀察者模式、WAL級別的觀察者模式以及master級別的觀察者模式。這三種觀察者模式所“監聽”的物件分別是region操作級別物件、wal操作級別的物件以及master操作級別的物件。

region級別:主要提供一些針對於region級別操作(put、get、delete等)的鉤子函式,使用者定義的此類觀察這在這些操作執行時被觸發。

wal級別:主要是提供一些針對於wal級別操作的鉤子函式。

master級別:主要是提供了一些針對於master級別操作(createtable、disabletable、droptable等)的鉤子函式

2、region級別觀察者

實現region級別的觀察者時需要繼承一個基本類,該類中已經包含了所有的region級別的鉤子函式,使用者只需要進行重寫即可:BaseRegiobObverser

在提供的所有的鉤子函式,都是以preDo() / postDo() 成對存在,例如 prePut() / postPut() 函式就是成對存在。preDo() 系列的函式表明了在執行Do所執行的動作之前執行鉤子函式。postDo() 系列函式標明在執行了Do之後執行鉤子函式。

例如下面的例子,我們要實現一個複製例子的資料,即將插入test表中的資料也全都插入到testCopy表中:

(1)進行Obverser兌現的編寫

觀察者例項:

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
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.hadoop.hbase.util.Bytes;

/**
 * @author wozipa
 * @Date 2016-3-20 20:57
 * @see 建立兩張一模一樣的表
 */
public class RegionObverserExample extends BaseRegionObserver{
	
	private static String tableName="testCopy";
	private static String family="copy";
	
	/**
	 * @author wozipa
	 * @Date 2016-3-20 21:00
	 * @see 進行表格的配置
	 * @return
	 */
	public Configuration init()
	{
		Configuration conf=new Configuration();
		conf.set("hbase.master", "hadoop1:16000");
		conf.set("hbase.zookeeper.quorum", "hadoop1,hadoop2,hadoop3,hadoop4,hadoop5,hadoop6");
		conf.set("hbase.zookeeper.property.clientPort", "2181");
		return conf;
	}
	

	/**
	 * @author wozipa
	 * @Date 2016-3-20 21:02
	 * @see 在插入資料之前將資料插入到指定的表格中
	 */
	@Override
	public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability)
			throws IOException {
		// TODO Auto-generated method stub
		Configuration conf=init();
		try {
			HBaseAdmin admin=new HBaseAdmin(conf);
			if(!admin.tableExists(tableName))
			{
				HTableDescriptor tableDescriptor=new HTableDescriptor(tableName);
				HColumnDescriptor columnDescriptor=new HColumnDescriptor(family);
				tableDescriptor.addFamily(columnDescriptor);
				admin.createTable(tableDescriptor);
				admin.close();
			}
			//建立資料插入該保重,保持行鍵值和列名、value值的相同
			Map<byte[],List<KeyValue>> map=put.getFamilyMap();
			List<KeyValue> list=map.get(put.getRow());
			Put put2=new Put(put.getRow());
			for(KeyValue kv:list)
			{
				put2.addColumn(Bytes.toBytes(family),kv.getQualifier(),kv.getValue());
			}
			//建立表連線
			HTable table=new HTable(conf, tableName);
			table.put(put2);
			//
			table.close();
		} catch (Exception e1) {
			// TODO: handle exception
			e1.printStackTrace();
		}
	}
}

在該物件中,通過實現prePut() 函式,即在test表的region執行put方法之前,將put中的資料插入到testCopy中。

(2)將專案打包成jar包後上傳到HDFS上

然後將該類所在的專案打包上傳到HDFS上:

(3)編寫例子類

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Coprocessor;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

import com.yammer.metrics.stats.EWMA;

/**
 * @author wozipa
 * @Date 2016-3-20 21:16
 * @see 用來測試協處理器的各個功能的函式集合
 *
 */
public class Main {
	
	private static String tableName="test";
	private static String family="test";
	
	public static void main(String[] args)
	{
		Main main=new Main();
		main.putCoprocessExample();
	}
	
	public Configuration init()
	{
		Configuration conf=new Configuration();
		conf.set("hbase.master", "hadoop1:16000");
		conf.set("hbase.zookeeper.quorum", "hadoop1,hadoop2,hadoop3,hadoop4,hadoop5,hadoop6");
		conf.set("hbase.zookeeper.property.clientPort", "2181");
		return conf;
	}
	
	/**
	 * @author wozipa
	 * @Date 2016-3-20 21:17
	 * @see 進行資料
	 */
	public void putCoprocessExample()
	{
		Configuration conf=init();
		HBaseAdmin admin=null;
		try {
			admin=new HBaseAdmin(conf);
			if(!admin.tableExists(tableName))
			{
				HTableDescriptor tableDescriptor=new HTableDescriptor(tableName);
				HColumnDescriptor columnDescriptor=new HColumnDescriptor(family);
				tableDescriptor.addFamily(columnDescriptor);
				Path path=new Path("hdfs://192.98.12.234:9000/Coprocessor/Copro.jar");
				tableDescriptor.setValue("COPROCESSOR$1",path.toString()+"|"+"com.geoway.coprocessor.RegionObverserExample|"+Coprocessor.PRIORITY_USER);
				admin.createTable(tableDescriptor);
			}
			//想資料庫中插入資料
			Put put=new Put(Bytes.toBytes("row-2"));
			put.addColumn(Bytes.toBytes(family), Bytes.toBytes("qualifier1"), Bytes.toBytes("value2"));
			HTable table=new HTable(conf, tableName);
			table.put(put);
			table.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
需要注意的是,在定義test表時,需要在表結構中定義協處理器的資訊。以為是通過程式碼新增表協處理器,因此該協處理器只針對test表有效。

最後執行結構會發現兩個表同時被建立:

3、master級別的觀察者模式

master級別的觀察者模式與region級別的模式相同,只不過其“監聽”的物件變成了master級別的操作。也就是相當於SQL語句中的DDL語句。主要包括對錶的一些操作物件和region級別的操作鉤子函式。

HBase中也提供了一個 BaseMasterObverser物件,該物件中也封裝了所有的DDL操作的鉤子函式。使用者只需要繼承該物件,並重寫相應的方法,就可實現相應的功能。其實現流程與region級別的流程一樣。

三、總結

觀察者模式提供了使用者在進行region級別操作之前與之後的自定義動作,因此可以實現很多功能,例如可以聽過觀察者實現二級索引等功能。

相關推薦

HBase總結11--觀察模式

一、介紹 上一屆簡單介紹了協處理器的主要功能以及相應的特點,但沒有對寫出器的具體內容作出詳細的解釋。這篇文章解釋了協處理器的觀察者模式。觀察者模式就是提供了一個觸發器,使用者通過整合相應的類(BaseRegionObverser等),重寫其中想要實現的方法,然後將協處理器載

設計模式觀察模式

針對 ray 需求 als bool 模式 null rri 主動 觀察者模式 定義了對象之間的一對多的依賴,這樣一來,當一個對象狀態改變時,他的 多有依賴都會受到通知並自動更新。 本例為一個溫度基站,和三個終端。溫度基站為廣播類WeatherData,三個終端監聽者類分別

設計模式學習觀察模式C#

original pan 學習筆記 pri 接口 program date contain 兩個 《深入淺出設計模式》學習筆記第二章 需求: 開發一套氣象監測應用,如圖: 氣象站,目前有三種裝置,溫度、濕度和氣壓感應裝置。 WeatherData對象追蹤氣象站的數據,並更

設計模式—— 觀察模式

pda 發出 dex obs index observe target 獲取 委托事件 觀察者模式類似出版社與訂閱者的關系,訂閱者能夠收到出版社發出的消息,可以取消訂閱。出版社在觀察者模式中稱為主題(Subject)訂閱者稱為觀察者(Observer)。 主

設計模式18觀察模式

模式介紹 觀察者模式試圖允許物件在其內部狀態改變時通知觀察者。 這意味著單個物件需要知道觀察它的物件,並且當狀態發生變化的時候,需要能夠與那些觀察者通訊。此外,觀察者應該被自動通知。 示例 設想我們需要一個系統來建模本地蔬菜市場中蔬菜價格的波動。 我們需要允許餐館檢視價格,並在特定蔬菜的價格低於指定閾

一看就懂【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式觀察模式

觀察者模式概述 觀察者模式(有時又被稱為模型-檢視(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統

PHP設計模式5—— 觀察模式

基本概念 整個觀察者模式,其實做的就是監聽事件、處理事件。 由此引出兩個角色,一個是觀察者Listener,另一個是事件處理者Handler。 例子 第一步,建立抽象事件類。 它的主要作用是提供兩個方法給具體事件類呼叫。 abstract clas

設計模式觀察模式

繼續設計模式的文章,今天給大家帶來觀察者模式。先來看看觀察者模式的定義:定義了物件之間的一對多的依賴,這樣一來,當一個物件改變時,它的所有的依賴者都會收到通知並自動更新。好了,對於定義的理解總是需要例項來解析的,如今的微信服務號相當火啊,下面就以微信服務號為背景,給大家介紹

《JavaScript設計模式與開發實踐》模式11—— 中介模式

中介者模式的作用就是解除物件與物件之間的緊耦合關係。增加一箇中介者物件後,所有的 相關物件都通過中介者物件來通訊,而不是互相引用,所以當一個物件發生改變時,只需要通知 中介者物件即可。中介者使各物件之間耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式使網狀的多對多關係變成了相對簡單的一對多關係

Java設計模式4--觀察模式

今天看了一下觀察者模式,總體來說不難,關鍵是要知道原理和這個模式的用法下面是我自己個人一些理解。 1、定義 觀察者模式,首先得有觀察者,一個或者多個觀察者,它們都依賴於另一個物件,也就是說,這些觀察者都觀察著一個被觀察者。那麼,當被觀察者狀態發生改變

Rx_java1 觀察模式例項講解

相關文章 寫在前面 通常我們的程式碼設計思想都是來源於生活,如面向物件的設計思想,觀察者模式等均來源現實生活。在我們正常接觸到的程式碼中,回撥介面、回撥函式、回撥引數、監聽器模式,這些也是觀察者模式。 觀察者模式(Observer)將觀察者和被觀察的物

Unity遊戲設計模式觀察模式Observer Pattern

        最近看遊戲設計模式,當看到觀察者模式時被搞得雲裡霧裡的,什麼觀察者,被觀察者,抽象觀察者,抽象被觀察者。聽著這些詞就覺得可怕,其實理解以後還是比較簡單的。         當我們玩遊戲時,經常會出現一些事件,而這個事件可能會影響到許多個模組時就可以用到觀察者

設計模式練習17——觀察模式

觀察者模式 一、題目: 某公司欲開發一套機房監控系統,如果機房達到一定指定溫度,感測器將作出反應,將訊號傳遞給響應裝置,如警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啟、隔熱門將自動關閉,每一響應裝置的行為右專門的程式來控制,為支援將來引入新型別的響

Head First 設計模式觀察模式

觀察者模式 定義 首先看下觀察者模式的定義 觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 按我自己的理解翻譯就是: 觀察者模式就是一個主題和多個依賴者的關係,當主題發生變化

Head First設計模式觀察模式

通過具體實現一個氣象監測系統來理解觀察者模式此係統的三個部分是氣象站(獲取實際氣象資料的物理裝置)、WeatherData物件(追蹤來自氣象站的資料,並更新佈告板)和佈告板(顯示目前天氣狀況給使用者看)。 具體來說該應用需要:利用WeatherDate物件從氣象站取得資料,

java設計模式1觀察模式

說到java觀察者模式 簡單點一個例子就是 被觀測方通過提供註冊介面,使得觀測方能夠通過註冊使得自己實時掌握被觀測方資料變化。 好了 接下來是程式碼 被觀測目標的介面,繼承這個類的目標天生自帶 拉人 踢人技能。只有被邀請的人才能看 1.subject.ava pac

Java 設計模式觀察模式

一、定義 觀察者模式定義了一個一對多的依賴關係,讓多個觀察者物件同時監聽同一個主題物件。當這個主題狀態發生改變時,會通知所有觀察者物件,讓它們自動更新自己。 二、類似場景 聊天室程式的建立。伺服器建立好後,A、B、C三個客戶端連線好公開聊天。A向

觀察模式詳解包含觀察模式JDK的漏洞以及事件驅動模型

import java.util.Vector; //被觀察者類 public class Observable { //這是一個改變標識,來標記該被觀察者有沒有改變 private boolean changed = false; //持有一個觀察者列表 private

設計模式-觀察模式、C#委託、事件

書中引出的例子為,當Boss回來,前臺通知員工好好工作的場景。1、觀察模式將通知廣播給每一個客戶端,客戶端想知道目標的變化a、從目標拉取 b、通知的時候將變化傳遞給客戶端。拉取的方法,客戶端自由度較高,客戶端可以根據需求拉取。觀察者通知內容豐富,客戶端需要不要更新拉取變化。耦

設計模式觀察監聽者模式

blog virtual ack memory message efault share default IT 基於MAP線程安全的觀察者監聽者模式 1 #include<map> 2 #include<string> 3 #i