33
HBase: The Definitive Guide CHAPTER 4 Client API: Advanced Features

H base the_definitive_guide_chapter_04_part2

Embed Size (px)

Citation preview

Page 1: H base the_definitive_guide_chapter_04_part2

HBase: The Definitive Guide

CHAPTER 4

Client API: Advanced Features

Page 2: H base the_definitive_guide_chapter_04_part2

この章の内容

• Filters ※前回はここまで

• Counters ※今回はここから。。

• Coprocessors ※毎度すみません、、、ここの途中まで。。。

• HTablePool

• Connection Handling

Page 3: H base the_definitive_guide_chapter_04_part2

Counters (p168~)• 用途

– 統計情報を収集• オンライン広告のクリック数、ビュー数、など。• ログファイル内のデータを収集して後で分析。

• カラムをカウンターとして扱う。• クライアントからの1回のRPCで、アトミックに read-and-modify できるメソッドを提供。

• CRUD Operations(p76)を用いて、複数のcounterを1回のRPC呼び出しで更新できる(multiple counters -> p172~)。

• multiple counters の更新は1つのRowに制限されている。– 複数Row の counterの更新は、Row毎にRPC呼び出しが必要。

• #batch() はIncrement instanceを未サポート。(近い将来、変わるらしい)

Page 4: H base the_definitive_guide_chapter_04_part2

An example using the shell (p168)

• テーブルを作成

• 2回インクリメント(=incr)

• 現在の値を確認(=get_counter)

hbase(main):001:0> create 'counters', 'daily', 'weekly', 'monthly'0 row(s) in 1.1930 seconds

hbase(main):002:0> incr 'counters', '20110101', 'daily:hits', 1COUNTER VALUE = 1

hbase(main):003:0> incr 'counters', '20110101', 'daily:hits', 1COUNTER VALUE = 2

hbase(main):04:0> get_counter 'counters', '20110101', 'daily:hits'COUNTER VALUE = 2

Page 5: H base the_definitive_guide_chapter_04_part2

increment (p169) (p170下) (p171上:Table 4-6)

(p169)• shell の incrコマンド

– incr '<table>', '<row>', '<column>', [<increment-value>]

(p170下)(p171上:Table 4-6)• インクリメント

– 引数に0より大きい数字– 与えられた引数の値をインクリメント– 引数を省略した場合は1

• 現在の値を取得– 引数に0– shell の get_counterと同じ

• デクリメント– 引数に0より小さい数字– 与えられた引数の値をデクリメント

Page 6: H base the_definitive_guide_chapter_04_part2

counterの初期化 (p169)• 明示的に初期化する必要はない

– 新しいcounterを使用する時に自動で0として初期化される。

– 最初のインクリメントの呼び出しで1、または引数で指定した数字を返す。

• 型はlong型

– Bytes.toBytes(long)

• 文字列(例:‘1’)でインクリメントすると結果がおかしくなる

– 文字列の‘1’ => 文字コード49 => byte[]の先頭が49 => [49,0,0,0,0,0,0,0] で解釈されるため

Page 7: H base the_definitive_guide_chapter_04_part2

getでのcounterへのアクセス (p170上)

• getでもcounterにアクセスできる。が、結果が読みづらい。

hbase(main):007:0> get 'counters', '20110101'COLUMN CELLdaily:hits timestamp=1301574412848, value=¥x00¥x00¥x00¥x00¥x00¥x00¥x00¥x161 row(s) in 0.0400 seconds

hbase(main):008:0> get_counter ‘counters’, '20110101', 'daily:hits'COUNTER VALUE = 22

Page 8: H base the_definitive_guide_chapter_04_part2

Single Counters (p171)

• shell の incrコマンド。

• HTableの以下のメソッド。

– writeWALのデフォルトはtrue

• Example 4-17 (p171)– ① 1インクリメント(amount = 1)

– ② 1インクリメント(amount = 1)

– ③現在値を取得 (amount = 0)

– ④ 1デクリメント (amount = -1)

long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier,long amount) throws IOException

long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount, boolean writeToWAL) throws IOException

Page 9: H base the_definitive_guide_chapter_04_part2

Multiple Counters (p172~)

• HTableの以下のメソッド。

• Increment クラスのコンストラクタ

– 全てのcounterを含むRowのrow keyを設定する

– rowLockを引数で渡すことで自分で排他制御できる。

– 他の書込みに対して、 1 つの行内でアトミックであるが、他の読み込みに対してはそれは当てはまらない。

Result increment(Increment increment) throws IOException

Increment() {}Increment(byte[] row)Increment(byte[] row, RowLock rowLock)

Page 10: H base the_definitive_guide_chapter_04_part2

Incrementクラス(p172~p173)

• 以下のメソッドで counter のカラムを定義

• 以下のメソッドで counter のexpire を指定

• Incrementクラスのその他のメソッド (p173) Table 4-7

Increment addColumn(byte[] family, byte[] qualifier, long amount)

Increment setTimeRange (long minStamp, long maxStamp) throws IOException

Page 11: H base the_definitive_guide_chapter_04_part2

Example 4-18 (p173 ~ p174)

• ① Increment#addColumn

• ② HTable#incrementを実行。

• ③②のResultをログ出力。

• ④ Increment#addColumn

• 結果

"daily:clicks" -> 1"daily:hits" -> 1"weekly:clicks" -> 10"weekly:hits" -> 10

"daily:clicks" -> 5"daily:hits" -> 1"weekly:clicks" -> 0"weekly:hits" -> -5

"daily:clicks" -> 6"daily:hits" -> 2"weekly:clicks" -> 10"weekly:hits" -> 5

Page 12: H base the_definitive_guide_chapter_04_part2

Coprocessors (p175~)

• サーバからクライアントへネットワークを流れるデータ量を減らす。

• 一部の計算をデータが存在するサーバ側に移すことで結果の量が減る。

• 任意のコードを各リージョンサーバ内で実行できる

– リージョン単位

• RDBMSにおける トリガーやストアドプロシージャのようなもの

Page 13: H base the_definitive_guide_chapter_04_part2

Coprocessors (p175~)• Filterとは対照的に、Coprocessors は動的にロードできる?

– 稼働中のクラスタに対して機能を拡張できる

• ユースケース

– Row の変更をフックして、セカンダリインデックスを維持する。

–参照整合性を実装する。

• 集約関数(sum, avg)

– Scan処理をデータが存在するサーバ側に移す

–結果の数字のみをクライアントに返す。

Page 14: H base the_definitive_guide_chapter_04_part2

Coprocessors (p175~p176)

• アクセスコントロール

–権限チェックは version 0.92 から coprocessors を使用して、HBaseに実装された。

• 2つの主なクラス

– Observer

– Endpoint

• Coprocessorインタフェースを基底として各処理を実装する。

• Servlet API の request filters のようにchainできる。

Page 15: H base the_definitive_guide_chapter_04_part2

Observer (p176)

• RDBMのトリガーと同等

–あるイベント発生時にcallback関数が実行される

• フレームワークで提供されているinterface

– RegionObserver

• テーブル内のリージョンと紐付く

– MasterObserver

• DDL操作。クラスタ全体に影響。

– WALObserver

• write-ahead ログ処理でフックする。

Page 16: H base the_definitive_guide_chapter_04_part2

Endpoint (p176)

• dynamic extensions to the RPC protocol

– 呼び出し可能なリモート·プロシージャを追加

• RDBMのストアドプロシージャと同等

• Observerの実装と組み合わせて、直接、サーバー側の状態と対話する

Page 17: H base the_definitive_guide_chapter_04_part2

The Coprocessor Class (p176 ~)

• 全てのcoprocessorはこのinterfaceを基底とする。

• 2つのenum

– Priority

– State

Page 18: H base the_definitive_guide_chapter_04_part2

Table 4-8 Coprocessor.Priority (p177)

– SYSTEM

• 最も優先される。最初に実行される。

– USER

• SYSTEMの後に実行される。

• 各Priorityに、シーケンス番号

– 0から始まる

–ロードされて実行される順番

Page 19: H base the_definitive_guide_chapter_04_part2

CoprocessorEnvironment (p177)• life cycle

– Coprocessorの開始時、廃止時に以下のメソッドが呼ばれる。

–引数のCoprocessorEnvironmentインスタンスは、Coprocessor インスタンスの存続期間にわたって状態を保持するために使用される。

• Table 4-9 (p177)

CoprocessorEnvironmentクラスのメソッド

void start(CoprocessorEnvironment env) throws IOException;void stop(CoprocessorEnvironment env) throws IOException;

Page 20: H base the_definitive_guide_chapter_04_part2

#getTable (p178)

• Coprocessorから、テーブルのデータにアクセスするには、 #getTable (Table 4-9 (p177))を使用すること

–戻り値のHtableは、デフォルトのHtableをsafetyにしたもの

• 例:Rowのロックができない仕様

– Coprocessorのコードの中で、デフォルトのHtable

を作成するのは可能。しかし、将来的に禁止になる可能性がある。

Page 21: H base the_definitive_guide_chapter_04_part2

Table 4-10 Coprocessor.State (p178)– UNINSTALLED

• Coprocessorは初期化状態。

– INSTALLED• Environmentにインストールされた。

– STARTING• 起動中。#start() が呼ばれようとしている。

– ACTIVE• #start () が終わった。

– STOPPING• # stop ()が呼び出される直前。

– STOPPED• # stop ()が終わった。

• #start(), #stop() は暗黙的にフレームワークから呼ばれる

Page 22: H base the_definitive_guide_chapter_04_part2

CoprocessorHost class(p178)

• 全てのcoprocessorインスタンスとenvironmentを維持。

• サーバの環境に合わせてサブクラスが存在

(Table4-11 (p180下))

– MasterCoprocessorHost

– RegionCoprocessorHost

– WALCoprocessorHost

Page 23: H base the_definitive_guide_chapter_04_part2

Figure 4-3. Coprocessors executed sequentially, in their environment, and per region (p179)

Page 24: H base the_definitive_guide_chapter_04_part2

Coprocessor Loading (p179)• Staticロード

– Configurationファイル

–テーブルスキーマ

• Dynamicロード

–まだAPIが公開されていない?

Page 25: H base the_definitive_guide_chapter_04_part2

Loading from the configuration (p180)• hbase-site.xml

• 上の設定で定義した順番で実行される。• CoprocessorHostによってロードされる (Table4-11 (p180))

– 例: hbase.coprocessor.master.classes で定義されたクラス→ MasterCoprocessorHost

<property><name>hbase.coprocessor.region.classes</name><value>coprocessor.RegionObserverExample,

coprocessor.AnotherCoprocessor</value></property><property>

<name>hbase.coprocessor.master.classes</name><value>coprocessor.MasterObserverExample</value>

</property><property>

<name>hbase.coprocessor.wal.classes</name><value>coprocessor.WALObserverExample, bar.foo.MyWALObserver</value>

</property>

Page 26: H base the_definitive_guide_chapter_04_part2

hbase.coprocessor.region.classesで定義したcoprocessorクラス (p181)

• テーブルの各リージョンがopenした際にロードされる。

• 特定のテーブル、または、リージョンを指定できない。

–全てのテーブル、全てのリージョンにロードされる

Page 27: H base the_definitive_guide_chapter_04_part2

Loading from the table descriptor (p181~p182)

• テーブル毎に定義可能なので、そのテーブルがあるリージョンに対してロードされる。

• 定義できるのは、リージョン用coprocessorのみ。Master用、WAL用は定義できない。

• テーブルがenableになって、リージョンがopenすると、– まずConfigurationファイルで定義したcoprocessorがロードされ、

– 次にtable descriptor定義したcoprocessorがロードされる。

• table descriptorで定義を追加するには

– HTableDescriptor#setValue(String key, String value)を使用• Keyの命名規則=” COPROCESSOR” から始まる

• Valueのformat=<path-to-jar>|<classname>|<priority>

Page 28: H base the_definitive_guide_chapter_04_part2

Example 4-19(p181)Path path = new Path(fs.getUri() + Path.SEPARATOR + “test.jar”); // ①HTableDescriptor htd = new HTableDescriptor(“testtable”); // ②htd.addFamily(new HColumnDescriptor("colfam1"));htd.setValue("COPROCESSOR$1", path.toString() +

“|” + RegionObserverExample.class.getCanonicalName() + // ③"|" + Coprocessor.Priority.USER);

HBaseAdmin admin = new HBaseAdmin(conf); // ④admin.createTable(htd);// --------------------------------------------------------------------------------------------------------------① JAR fileの場所を設定② HTableDescriptorを生成(テーブル名= “testtable”)③ coprocessorの定義

Keyの命名規則=” COPROCESSOR” から始まるValueのformat=<path-to-jar>|<classname>|<priority>

④HBaseAdminを生成。次の行でテーブル作成。// --------------------------------------------------------------------------------------------------------------{NAME => 'testtable', COPROCESSOR$1 => ¥'file:/test.jar|coprocessor.RegionObserverExample|USER', FAMILIES => ¥[{NAME => 'colfam1', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', ¥COMPRESSION => 'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE ¥=> '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}]}

Page 29: H base the_definitive_guide_chapter_04_part2

The RegionObserver Class (p182)

• リージョンレベルの Observer Coprocessor。

– リージョンレベルのtriggerをフックする

• 2つのグループに分かれる

– region life-cycle changes

– client API calls

Page 30: H base the_definitive_guide_chapter_04_part2

Handling region life-cycle events(p183)

• Figure 4-4(p183)

– “The Region Life Cycle”(p348)を簡略化した図

• 次の3つのstateの変更に関連する

– pending open

– Open

– pending close

Page 31: H base the_definitive_guide_chapter_04_part2

State (p183~p184)

• pending open

– void preOpen(...) / void postOpen(...)

– void preWALRestore(...) / void postWALRestore(...)

• Open

– void preFlush(...) / void postFlush(...)

– void preCompact(...) / void postCompact(...)

– void preSplit(...) / void postSplit(...)

• pending close

– void preClose(..., boolean abortRequested) /

– void postClose(..., boolean abortRequested)

Page 32: H base the_definitive_guide_chapter_04_part2

Handling client API events(p184~p185)

• life-cycle events とは対照的に、明示的にクライアントからリージョンサーバへ送信される。

• APIコールの前後にフックできる。– void preGet(...) / void postGet(...)

– void prePut(...) / void postPut(...)

– void preDelete(...) / void postDelete(...)

– (※中略)

– long preIncrementColumnValue(...) / long postIncrementColumnValue(...)

– void preIncrement(...) / void postIncrement(...)

– InternalScanner preScannerOpen(...) / InternalScanner postScannerOpen(...)

– boolean preScannerNext(...) / boolean postScannerNext(...)

– boolean preScannerNext(...) / boolean postScannerNext(...)

Page 33: H base the_definitive_guide_chapter_04_part2

The RegionCoprocessorEnvironmentclass(p185)

• Table 4-12 (p185) RegionCoprocessorEnvironment

のメソッド

• Table 4-13 (p186) RegionServerServicesのメソッド

書きかけ。。ごめんなさい。。