SHOEISHA iD

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

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

初めてのHBase

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

初めてのHBase 第3回


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

 前回はHBaseのアーキテクチャについて解説しました。今回はHBaseを使ったアプリケーションのケーススタディとして、簡易ブログサービスを作っていきます。

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

サンプルコード

 本稿のサンプルコードはGitHubにもアップしています。併せてご参照ください。

はじめに

 HBaseを使うことのメリットは、RDBで扱いきれないような大規模なデータを扱えることです。しかし、スキーマ設計を間違えるとまったくスケールしなくなってしまい、HBaseを使う意味がなくなってしまいます。ここがHBaseの難しい部分ではありますが、1度覚えてしまえばそんなに難しくはありません。

 今回は簡易ブログサービスを通して、HBaseにおけるスキーマ設計のテクニックを紹介していきたいと思います。

対象読者

  • HBaseを使ってみたいけどどう使ったらよいか分からない方
  • MySQLなどのRDB以外のデータベースを使ってみたい方

開発の準備

 まずは、HBaseを使ってアプリケーションを作るための準備をしましょう。

HBaseのインストールのおさらい

 最初にHBaseのインストールのおさらいをします。

 インストールについては本連載ですでに説明しましたが、HBaseのステーブルのバージョンが上がっているのでそちらに変更しています。

 まず、HBaseをダウンロードします。

$ cd /usr/local
$ curl -O http://ftp.kddilabs.jp/infosystems/apache/hbase/hbase-0.94.6.1/hbase-0.94.6.1.tar.gz

 ダウンロードが完了したら、解凍します。

$ tar -zxvf hbase-0.94.6.1.tar.gz
$ cd hbase-0.94.6.1

 Javaへのパスが通っていない場合は、以下を実行します

$ export JAVA_HOME=<Javaのインストールパス>

 HBaseを起動します。

$ bin/start-hbase.sh

 HBaseを停止したい場合は、以下のコマンドを実行します。

$ bin/stop-hbase.sh

Java+Maven

 開発言語としてはJavaを使います。また、ビルドツールとしてはMavenを使います。JavaやMavenのインストール方法については割愛します。

 HBaseを用いたアプリケーションを作成するために、pom.xmlに以下のdependencyを指定してください。

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-core</artifactId>
  <version>1.0.4</version>
</dependency>

<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase</artifactId>
  <version>0.94.6.1</version>
</dependency>

HBaseのJava API

 アプリケーションを作る前にHBaseのJava APIを紹介します。ここで使うTableを以下のようにHBase shellで作成してください。

$ bin/hbase shell

hbase(main):001:0> create "tbl", "fam"
0 row(s) in 1.0730 seconds

HTable

 まず、HTableについて紹介します。HTableは、HBaseのクライアントのベースとなるクラスです。HTable経由でCRUD操作やIncreament、CAS操作などを行います。

 HTableは以下のように生成します。

Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "localhost");

// HTableオブジェクトを生成する際に、ConfigurationオブジェクトとTable名を指定
HTable table = new HTable(conf, "tbl");

...

// 使い終わったらclose
table.close();

 Configurationは名前のとおり、設定を管理するクラスです。Configurationオブジェクトに対して、"hbase.zookeeper.quorum"という設定に"localhost"をセットしています。

 前回にも説明しましたが、HBaseのクライアントはまずZookeeperにアクセスします。その際に、どのZookeeperにアクセスするかという設定が"hbase.zookeeper.quorum"です。

 今回はローカルにHBaseを立てているので、"localhost"を指定しています。

Put

 次に、HBaseに対してデータをPutしてみましょう。以下が、Putのコードになります。

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

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

byte[] col2 = Bytes.toBytes("col2");
byte[] val2 = Bytes.toBytes("val2");

// Putオブジェクトを生成する際にRowKeyを指定
Put put = new Put(row);

// PutするColumnをaddする
put.add(fam, col1, val1);
put.add(fam, col2, val2);

// Putする
table.put(put);

 上記では、"row"というRowKeyのRowに対して、ColumnFamilyが"fam"で2つのColumnの"col1"と"col2"をPutしています。2つのColumnの"col1"と"col2"のValueはそれぞれ"val1"と"val2"になります。ここでは2つのColumnを指定しPutしていますが、この操作はアトミックに行われます。

 HBaseでは、基本的にRowKeyやColumnなど、byte配列で扱うことが多いので、Bytesというユーティリティクラスが用意されています。Bytes.toBytesで、文字列型をbyte配列に変換することができます。

 上記のプログラムを実行したら、HBase shellでデータが入っているかどうかを確認してみましょう。

hbase(main):001:0> scan "tbl"
ROW                                            COLUMN+CELL
 row                                           column=fam:col1, timestamp=1366522283779, value=val1
 row                                           column=fam:col2, timestamp=1366522283779, value=val2
1 row(s) in 0.0420 seconds

 データが入っているのが分かります。Timestamp指定でPutすることも可能です。

// Timestamp
long ts = System.currentTimeMillis();

put.add(fam, col1, ts, val1);
put.add(fam, col2, ts, val2);

 本連載ですでに説明しましたが、HBaseのストレージフォーマットは各エントリでTimestampを持っており、これを用いてバージョニングを行っています。

 これによって、後からデータを取り出すときに複数バージョン(デフォルトで3)を取得することができます。

 Timestampを指定でPutすることよって、古いデータを後から入れることもできます。これは、使い方によっては面白いことができるので、覚えておくと良いでしょう。

 ちなみに、Timestampを指定せずにPutした場合は、実際にデータが扱われるHRegionServerの時間が使われます。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
Get

修正履歴

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング