NoSQLデータベースを試してみる

第5回大規模データを扱うためのHBaseとCassandra

はじめに

今回は列指向型データベースとしてHBaseとCassandraを取り上げます。FacebookやTwitterなど、大規模なデータを抱える企業で使われ始めてきている注目のNoSQLデータベースです。

なお、今回も利用したコードやプログラムは、githubに置いてあるので適宜参照してください。

列指向データベースの特徴

一般的にRDBMSは行単位でデータを格納しているため、行単位での読み込み処理が得意です。これらは行指向データベースとも呼ばれます。一方、列指向データベースは列単位でデータを格納しており、列単位でデータを読み込む処理が得意です。

表1 行指向データベースと列指向データベースとの比較
データ型データの格納得意なこと
行指向データベース行単位少数の行に対する取得・更新
列指向データベース列単位大量の行に対する少数の列の取得、全行に対する特定列の一括更新

HBaseとCassandraの比較

それでは、HBaseとCassandraは何が違うのでしょうか。

HBaseとCassandraでは「何を保証するか」が違います。HBaseはデータの一貫性を保証します。例えば、特定のノードが故障した場合には自動的に他のノードにデータのコピー(レプリカ)を作成してくれます。一方で、Cassanderaではすべてのノードが同列で扱われるため、SPOF(単一故障点)が無く、可用性に強みがあります。ただし、ノード故障時にはレプリカが自動では復旧しないので、手動での対応が必要です。

表2 HBaseとCassandra、それぞれの特徴を比較
データベース強み構成レプリカの復旧分散方法
HBase一貫性マスター/スレーブ自動sharding
Cassandra可用性P2P型手動Consistent Hashing

どんなところに使える?

HBaseやCassandraはどちらもRDBMSで扱いきれないような大規模なデータの扱いに力を発揮します。強力なスケーラビリティも備えているため、データが増えても処理速度はそれほど低下しません。また、列指向データベースの強みを活かして、大量のデータを更新するようなバッチ処理のストレージとして利用しても有用でしょう。

具体的な利用シーン
  • 大規模なデータをスケーラブルに処理する必要がある場合
  • 大量データをバッチ処理する際のストレージとしての利用

HBaseのインストール

本稿では、実際にHBaseを使ってみましょう[1]⁠。

まずは1台のサーバ上で環境を整えます。わかりにくかもしれないので、以下の手順を参考にしてください。JDK6およびHadoopのインストールが必要です。

プロンプト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が起動しているサーバの60010番ポートにアクセスすることで以下のような画面が表示されるはずです。

図1 HBaseのWebインタフェース
図1 HBaseのWebインタフェース

HBaseのテーブル構造

ここで簡単にHBaseのテーブル構造を紹介します。RDBMSと似ていますが、列ファミリという新しい概念が登場してきます。これはイメージとしてはRDBMSの列(カラム)に相当するものです。なお、Cassandraのデータ構造はHBaseとはまた少し違うので注意してください。

図2 HBaseのテーブル構造
図2 HBaseのテーブル構造

HBaseを試してみる

それでは、HBaseをRailsから扱ってみます。今回はhbase-stargateというライブラリを使うのですが、このライブラリではStargateというRESTfulなWebサービスフロントエンドを利用します[2]⁠。

プロンプト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は、列ファミリというRDBMSでは存在しない概念があるため最初の敷居が高いかもしれませんが、非常に高性能なデータベースです。Hadoopのストレージとして利用することも可能なので、そういった観点からも今後ますます注目されていくと思われます[3]⁠。

おすすめ記事

記事・ニュース一覧