SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

初めてのHBase

HBaseを使って簡易ブログサービスを作ってみよう

初めてのHBase 第3回


  • X ポスト
  • このエントリーをはてなブックマークに追加

Filter

 ScanやGetには、Filterを指定することができます。Filterを使用することで、よりきめ細かく取得するデータを指定できます。

 ScanやGetに、以下のような設定することができます。

// ColumnPrefixFilterの指定
get.setFilter(new ColumnPrefixFilter(Bytes.toBytes("col")));

// PrefixFilterの指定
scan.setFilter(new PrefixFilter(Bytes.toBytes("row")));

 Filterは、基本的なものはもともと用意されています。また、カスタムFilterも作成することができます。

Increment

 次は、Incrementについて説明します。Incrementを用いることで簡単にカウンターを作ることが可能です。

 Incrementの例は以下のようになります。

byte[] row = Bytes.toBytes("row");
byte[] fam = Bytes.toBytes("fam");
byte[] col = Bytes.toBytes("col");

// インクリメント
long counter = table.incrementColumnValue(row, fam, col, 1L);

// デクリメント
counter = table.incrementColumnValue(row, fam, col, -1L);

 HTableのincrementColumnValueによって、RowKeyが"row"でColumnFamilyが"fam"、Columnが"col"のValueをインクリメントしてその後にデクリメントしている例です。

 incrementColumnValueの戻り値としては、加算された後のValueが返ってきます。

 また、以下のように同じRow内のColumnであれば一度に行うことができます。

byte[] row = Bytes.toBytes("row");
byte[] fam = Bytes.toBytes("fam");
byte[] col1 = Bytes.toBytes("col1");
byte[] col2 = Bytes.toBytes("col2");

Increment increment = new Increment(row);
increment.addColumn(fam, col1, 1L);
increment.addColumn(fam, col2, -1L);

// まとめてインクリメント・デクリメント
Result result = table.increment(increment);

 ただし、この処理は読み込みに対してはアトミックではありません。一部は更新済みで、一部は更新されていない状態が起こりうるので、注意が必要です。

 incrementの戻り値としては、加算後のResultオブジェクトが返ってきます。

CAS

 CASの例は以下にようになります。

byte[] row = Bytes.toBytes("row");
byte[] fam = Bytes.toBytes("fam");

byte[] col = Bytes.toBytes("col");
byte[] expect = Bytes.toBytes("expect");
byte[] update = Bytes.toBytes("update");

// 更新後のPut
Put put = new Put(row);
put.add(fam, col, update);

// 更新が成功すればtrueが返ってくる
boolean success = table.checkAndPut(row, fam, col, expect, put);

 RowKeyが"row"で、ColumnFamilyが"fam"、Columnが"col"のValueが"expect"であれば、"update"に変更するという例です。

 更新が成功した場合は、checkAndPutの戻り値としてtrueが返ってきます。また、Delete版も用意されています。

byte[] row = Bytes.toBytes("row");
byte[] fam = Bytes.toBytes("fam");

byte[] col = Bytes.toBytes("col");
byte[] expect = Bytes.toBytes("val1");

// 削除
Delete delete = new Delete(row);
delete.deleteColumns(fam, col);

// 削除が成功すればtrueが返ってくる
boolean success = table.checkAndDelete(row, fam, col, expect, delete);

 RowKeyが"row"で、ColumnFamilyが"fam"、Columnが"col"のValueが"expect"であれば削除するという例です。

 CASを使用することで、ロックを持つ必要がなくなるため、クライアント側の処理をシンプルにすることができます。

HTablePool

 HTableオブジェクトは生成コストが高く、さらにスレッドセーフには作られていません。そこで、HTablePoolというHTableをプーリングする機構が用意されています。

Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "localhost");
HTablePool hTablePool = new HTablePool(conf, Integer.MAX_VALUE);

// HTableじゃなくてHTableInterface
HTableInterface table = hTablePool.getTable("tbl");

// tableをcloseするとpoolに戻される
table.close();

// 使い終わったらcloseする
hTablePool.close();

 HTablePoolのgetTableで返ってくるのは、HTableではなくHTableInterfaceであることに注意ですが、基本的なメソッドは同じなのであまり意識する必要はありません。

次のページ
簡易ブログサービスの開発

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
初めてのHBase連載記事一覧

もっと読む

この記事の著者

鈴木 俊裕(スズキ トシヒロ)

株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory 2008年4月に株式会社サイバーエージェントに新卒で入社。基盤システムの開発・運用に従事する。 2010年4月にHadoop/Hiveを用いたログ解析基盤の開発・運用を担当する。 2011年4月に、ログ解析、レコメンド、検索エンジンなどを開発するAmeba Technology Laboratoryの立ち上げメンバーとなる。 2011年10月からHBaseを用...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7128 2013/09/24 19:02

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング