NoSQLデータベースを試してみる
第5回 大規模データを扱うためのHBaseとCassandra
はじめに
今回は列指向型データベースとしてHBaseとCassandraを取り上げます。FacebookやTwitterなど,
なお,
列指向データベースの特徴
一般的にRDBMSは行単位でデータを格納しているため,
表1 行指向データベースと列指向データベースとの比較
データ型 | データの格納 | 得意なこと |
---|---|---|
行指向データベース | 行単位 | 少数の行に対する取得・ |
列指向データベース | 列単位 | 大量の行に対する少数の列の取得, |
HBaseとCassandraの比較
それでは,
HBaseとCassandraでは
表2 HBaseとCassandra,
データベース | 強み | 構成 | レプリカの復旧 | 分散方法 |
---|---|---|---|---|
HBase | 一貫性 | マスター/スレーブ | 自動 | sharding |
Cassandra | 可用性 | P2P型 | 手動 | Consistent Hashing |
どんなところに使える?
HBaseやCassandraはどちらもRDBMSで扱いきれないような大規模なデータの扱いに力を発揮します。強力なスケーラビリティも備えているため,
- 具体的な利用シーン
-
- 大規模なデータをスケーラブルに処理する必要がある場合
- 大量データをバッチ処理する際のストレージとしての利用
HBaseのインストール
本稿では,
- ※1
- Cassandraについては大谷さんが連載されているので,
そちらをご覧ください。
まずは1台のサーバ上で環境を整えます。わかりにくかもしれないので,
プロンプト1 HBaseのインストール&起動の手順
# http://java.sun.com/javase/ja/6/download.html からJDK6をダウンロード # JDK 1.6.0_18, JDK 1.6.0_19は色々な問題があるので使用しない方が良い sudo sh jdk-6u21-linux-i586-rpm.bin java -version # 1.6.0_21 wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo sudo mv cloudera-cdh3.repo /etc/yum.repos.d/ sudo yum update yum sudo yum install hadoop-0.20 -y sudo yum install hadoop-0.20-conf-pseudo -y sudo yum install hadoop-hbase -y # JAVA_HOMEの設定が必要 export JAVA_HOME=xxx sudo /etc/init.d/hadoop-0.20-namenode start sudo /etc/init.d/hadoop-0.20-jobtracker start sudo /etc/init.d/hadoop-0.20-datanode start sudo /etc/init.d/hadoop-0.20-tasktracker start sudo /etc/init.d/hadoop-hbase-master start
HBaseが起動していれば,
HBaseのテーブル構造
ここで簡単にHBaseのテーブル構造を紹介します。RDBMSと似ていますが,
HBaseを試してみる
それでは,
- ※2
- Stargateは8080番ポートで待ち受けます。
プロンプト2 hbase-stargateのインストールとStargateの起動
gem install hbase-stargate
hbase org.apache.hadoop.hbase.rest.Main # Stargateの起動
実際のコードは非常にわかりやすいです。specファイルも用意されているので,
リスト1 RailsからHBaseを利用するコードの例
class HbaseController < ApplicationController
require 'stargate'
def sample
client = Stargate::Client.new("http://localhost:8080")
# テーブルの一覧を返す
client.list_tables
# usersテーブルを作成(user, blogは列ファミリ)
client.create_table('users', 'user', 'blog')
# usersテーブルにrow_idがA00001のデータを作成する
client.create_row('users', 'A00001', Time.now.to_i, [{:name => 'blog:title', :value => "(゚∀゚)o彡 sasata299's blog"}, {:name => 'blog:type', :value => 'livedoor'}])
# usersテーブルのrow_idがA00001のデータを取得する
# 見つからない場合,例外(Stargate::RowNotFoundError)を返す
row = client.show_row('users', 'A00001')
row.columns.each do |_row|
p _row.name # "blog:title", "blog:type"
p _row.value # "(゚∀゚)o彡 sasata299's blog", "livedoor"
end
# usersテーブルを削除する
client.delete_table('users')
end
end
まとめ
今回扱ったHBaseやCassandraは,
- ※3
- CassandraのHadoop対応はまだ限定的なようです。
バックナンバー
NoSQLデータベースを試してみる
- 第6回 パフォーマンスはどうなの?
- 第5回 大規模データを扱うためのHBaseとCassandra
- 第4回 スキーマレスで柔軟に扱えるMongoDB
- 第3回 様々なデータ型を扱えるTokyoTyrant
- 第2回 RDBMSと組み合わせて使えるmemcached
- 第1回 RDBMSとNoSQLデータベース