概要 †
- HadoopのHDFS上に構築されたデータベース
- ランダムアクセス、シーケンシャルアクセス共に低レイテンシで行えるデータストア
- テーブルはリージョンに自動的に分割され、リージョンはワーカーノードにランダムに割り当てられる
- テーブル構造は柔軟で、行を書き込むときに自由にカラムを追加できる
- データ型はByte配列
- カラム指向
- リアルタイム、MapReduce?処理の両方に対応可能
- 自動シャーディング
- インデックスは持たない
- レコードはキー順に格納される
- SQLはサポートされない
- 強い一貫性
- 更新前の古いデータが見えることはない
- レコードに関する操作はアトミック
HBaseの構成要素 †
テーブル・ファイル †
- 名前の付いたTableに、Rowと呼ばれる従来のRDBでいうレコードに相当する形式でデータを保持
- 各データはKeyと任意の数のColumnを持っており、Key順に並べられて保持されている
- 同一のTableでも保持するColumnの数が大きく変化する為にTableはまばらな状態で蓄えられる
- Columnの名称は"<Family>:<Label>"という形式になっており、<Family>と<Label>とで任意の大きさのByteArray?になっている
- 実File上ではColumnFamilies?毎に分かれて保存されている
- HBaseのTableはRowKey?の昇順、Column名の昇順、Timestampの降順の順で並べられたRowの塊に見えるが、実際は一定範囲毎にRowを区切り、Region(BigTable?のTabletに相当)と呼ばれるファイルの形で保存される
- Regionは先頭Key(実ファイル含む)から末尾Key(実ファイル含まず)を含んでおり、適切な順で並べられたRegionファイルが、一個のTableに相当する
- Regionファイルの内部で各ColumnFamily?はHStoreとして保存される
サーバ †
- HBaseMaster? (HM)
- HRegionServer? (RS)
- ZooKeeper (ZK)
- Rootテーブルの位置情報保持
- HBaseMaster?の情報保持
- HDFS
使い方 on Mac OS X †
Hadoopのインストール・起動/停止 †
- Hadoop のダウンロード
- HBase のダウンロード
- 展開してできたフォルダを /usr/local/ に移動し、シンボリックリンクを張る
$ cd /usr/local
$ sudo ln -s hadoop-0.20.2 hadoop
$ sudo ln -s hbase-0.20.6 hbase
- /usr/local/hadoop/conf/hadoop-env.sh の JAVA_HOME を編集
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
- Hadoop用にSSHのキーファイルを生成
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa_for_hadoop
$ cat ~/.ssh/id_dsa_for_hadoop.pub >> ~/.ssh/authorized_keys
- /usr/local/hadoop/conf/hadoop-env.sh の HADOOP_SSH_OPTS を編集
export HADOOP_SSH_OPTS="-i /Users/$USER/.ssh/id_dsa_for_hadoop"
- 設定ファイル(/usr/local/hadoop/conf/*.xml)の編集
- 起動
$ /usr/local/hadoop/bin/start-all.sh
- プロセス確認
$ ps ax | grep hadoop
org.apache.hadoop.mapred.JobTracker
org.apache.hadoop.hdfs.server.namenode.NameNode
org.apache.hadoop.mapred.TaskTracker
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
org.apache.hadoop.hdfs.server.datanode.DataNode
HBaseのインストール・起動/停止 †
HBase shell でテスト †
$ /usr/local/hbase/bin/hbase shell
hbase(main):001:0> help
hbase(main):002:0> create "mylittletable", "mylittlecolumnfamily"
hbase(main):003:0> describe "mylittletable"
hbase(main):004:0> put "mylittletable", "myrow", "mylittlecolumnfamily:x", "v"
hbase(main):005:0> get "mylittletable", "myrow"
hbase(main):006:0> scan "mylittletable"
パフォーマンス †
チューニング †
- HBase を安定稼動させるためには、Java VM のレスポンス悪化を防ぐことが非常に重要
- サーバーには十分な RAM を搭載し、Java VM のヒープサイズや、カーネルパラメータ(vm.swappiness)も適切に設定する必要がある
- HBase の一般的な構成、Region Server、HDFS Data Node、Hadoop Task Trackerを同じサーバー上で稼働させるためには、最低でも、8GB の RAM を搭載する必要がある。20GB前後搭載するのが一般的。
- Facebook の HDFS クラスターは 21 PB !!!
- 21 PB of storage in a single HDFS cluster
- 2000 machines
- 12 TB per machine (a few machines have 24 TB each)
- 1200 machines with 8 cores each + 800 machines with 16 cores each
- 32 GB of RAM per machine
- 15 map-reduce tasks per machine
運用 †
各言語での使用 †
Scala †
事例 †