HBase 基礎文法最速マスター

基礎文法最速マスターが流行のようなので、
便乗して勉強がてらにHBaseの基本操作について纏めてみます。

これを読めばGoogleBigTableのクローンであるHBaseの基本操作について何となく理解できるかも?です。
他の基礎文法最速マスターと同じように簡易リファレンスを兼ねていますので足りない部分をあればご指摘ください。


HBaseは2010-02-01時点で最新のHBase0.20.3を対象としています。
インストール方法については前記事を参照ください。

対話式シェルの実行

基本

HBaseではHBase Shellという対話式シェルが提供されています。

$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Version: 0.20.3, r902334, Mon Jun 25 13:13:08 PDT 2010
hbase(main):001:0>

対話式シェルではコマンドを実行することにより対話的にHBaseに接続することができます。
次の例ではhelpコマンドを実行し利用できるコマンドの一覧を確認しています。

hbase(main):001:0> help
HBASE SHELL COMMANDS:
 alter     Alter column family schema;  pass table name and a dictionary
           specifying new column family schema. Dictionaries are described
           below in the GENERAL NOTES section.  Dictionary must include name
           of column family to alter.  For example,
コマンドの実行結果をHBase Shellに渡して実行

パイプを使ってコマンドを渡すことによりHBase Shellを実行することもできます。

$ echo 'help' | hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Version: 0.20.3, r902334, Mon Jun 25 13:13:08 PDT 2010
help
HBASE SHELL COMMANDS:
 alter     Alter column family schema;  pass table name and a dictionary
           specifying new column family schema. Dictionaries are described
           below in the GENERAL NOTES section.  Dictionary must include name
           of column family to alter.  For example,

HBase Shellの実行結果をファイルに出力することもできます。

$ echo 'help' | hbase shell > hbase_help.txt
スクリプト実行

hbase shellの引数でHBase Shellスクリプトパスを指定することで実行することもできます。

$ cat /tmp/hbase.txt
help
exit

$ hbase shell /tmp/hbase.txt
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Version: 0.20.3, r902334, Mon Jun 25 13:13:08 PDT 2010
help
HBASE SHELL COMMANDS:
 alter     Alter column family schema;  pass table name and a dictionary
           specifying new column family schema. Dictionaries are described
           below in the GENERAL NOTES section.  Dictionary must include name
           of column family to alter.  For example,

またJRubyスクリプトパスを指定することで実行することもできます。

$ cat /tmp/scan.rb
{{{c = HBaseConfiguration.new() t = HTable.new(c, "TestTable") columns = ["info:"].to_java(java.lang.String) s = t.getScanner(columns, "", "0000000003", HConstants::LATEST_TIMESTAMP).iterator() while s.hasNext() do

    * puts String.from_java_bytes s.next().getRow() 

end}}}

$ hbase shell /tmp/scan.rb
HBase Shellトリック

ホームディレクトリに.irbrcというファイルを作成してHBase Shellの設定をカスタマイズすることができます。

以下の設定の場合はHBase Shellで実行したコマンドの履歴を200件保持することができます。
履歴は.irb-save-historyに記録されるためシェルを再起動しても履歴は保持されます。
HBase Shellを頻繁に再起動する場合に便利です。

$ cat ~/.irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 200
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"

HBase基本操作 - クラスタ

HBaseクラスターの情報確認

クラスターの確認を行うにはstatusコマンドを実行します。
statusコマンドは引数に'simple','summary','detailed'の3種類を指定することができ、
引数を指定しない場合は'summary'が表示されます。

hbase(main):001:0> status
1 servers, 0 dead, 3.0000 average load
hbase(main):002:0> statsu 'simple'
1 live servers
    TAKAO-NOTE:3398 1265196434625
        requests=0, regions=3, usedHeap=22, maxHeap=996
0 dead servers
hbase(main):003:0> status 'summary'
1 servers, 0 dead, 3.0000 average load
hbase(main):004:0> status 'detailed'
version 0.20.3
0 regionsInTransition
1 live servers
    TAKAO-NOTE:3398 1265196434625
        requests=0, regions=3, usedHeap=24, maxHeap=996
        .META.,,1
            stores=2, storefiles=3, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0
        test,,1265160603921
            stores=1, storefiles=1, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0
        -ROOT-,,0
            stores=1, storefiles=2, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0
0 dead servers
クラスターの停止

HBase Shellからクラスターを停止することができます。
ただ、HBase Shellから起動することは出来ませんので実行には注意する必要があります。

hbase(main):001:0> shutdown
hbase(main):002:0> status
NativeException: org.apache.hadoop.hbase.MasterNotRunningException: master has been shut down

HBase基本操作 - Tableの操作

MySQLを比較対照としてHBase Shellの基本操作を記述します。
HBaseではテーブルの有効/無効の考え方があり、alterやdrop操作はテーブル無効後に行います。

Tableの作成
  • HBase Shell
create 'City', {NAME=>'ID'}, {NAME=>'Name'}, {NAME=>'CountryCode'}, {NAME=>'Population'}
CREATE TABLE City (
  ID int(11) NOT NULL auto_increment,
  Name char(35) NOT NULL default '',
  CountryCode char(3) NOT NULL default '',
  Population int(11) NOT NULL default '0',
  PRIMARY KEY  (ID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Tableの一覧表示

  • HBase Shell
hbase(main):073:0> list
City
1 row(s) in 0.0160 seconds
SHOW TABLES;

Tableの無効化(HBase独自)

hbase(main):071:0> disable 'City'
0 row(s) in 5.0620 seconds

Tableの有効化(HBase独自)

hbase(main):072:0> enable 'City'
0 row(s) in 0.0160 seconds

Tableの存在確認(HBase独自)

hbase(main):070:0> exists 'City'
true
1 row(s) in 0.0000 seconds

Tableの情報表示(HBase独自)

hbase(main):074:0> describe 'City'
DESCRIPTION                                                             ENABLED
 {NAME => 'City', FAMILIES => [{NAME => 'CountryCode', VERSIONS => '3', true
  COMPRESSION => 'NONE', TTL => '2147483647', BLOCKSIZE => '65536', IN_
 MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'ID', VERSIONS => '
 3', COMPRESSION => 'NONE', TTL => '2147483647', BLOCKSIZE => '65536',
 IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'Name', VERSIONS
  => '3', COMPRESSION => 'NONE', TTL => '2147483647', BLOCKSIZE => '655
 36', IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'Population
 ', VERSIONS => '3', COMPRESSION => 'NONE', TTL => '2147483647', BLOCKS
 IZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}]}
1 row(s) in 0.0320 seconds
Tableのカラム追加
  • HBase Shell
disable 'City'
alter 'City', {NAME=>'District'}
enable 'City' 
ALTER TABLE City ADD District char(20);
Tableのカラム削除
  • HBase Shell
disable 'City'
alter 'City', {NAME=>'District', METHOD=>'delete'}
enable 'City' 
ALTER TABLE City DROP District;
Tableの削除
  • HBase
disable 'City'
drop 'City'
DROP TABLE City;

HBase基本操作 - データの操作

データの挿入

IDがindexになるようにデータを挿入しています。

  • HBase
put 'City', '1', 'ID', '1'
put 'City', '1', 'Name', 'Kabul'
put 'City', '1', 'CountryCode', 'AFG'
put 'City', '1', 'Population', '1780000'
put 'City', '2', 'ID', '2'
put 'City', '2', 'Name', 'Qandahar'
put 'City', '2', 'CountryCode', 'AFG'
put 'City', '2', 'Population', '237500'
put 'City', '3', 'ID', '3'
put 'City', '3', 'Name', 'Herat'
put 'City', '3', 'CountryCode', 'AFG'
put 'City', '3', 'Population', '186800'
INSERT INTO City VALUES (1, 'Kabul', 'AFG', 1780000);
INSERT INTO City VALUES (2,'Qandahar','AFG', 237500);
INSERT INTO City VALUES (3,'Herat','AFG', 186800);
データの検索(全て)
  • HBase
hbase(main):051:0> scan 'City'
ROW                          COLUMN+CELL
 1                           column=CountryCode:, timestamp=1265205866562, value=AFG
 1                           column=ID:, timestamp=1265205853640, value=1
 1                           column=Name:, timestamp=1265205860375, value=Kabul
 1                           column=Population:, timestamp=1265205872140, value=1780000
 2                           column=CountryCode:, timestamp=1265207385421, value=AFG
 2                           column=ID:, timestamp=1265207385390, value=2
 2                           column=Name:, timestamp=1265207385390, value=Qandahar
 2                           column=Population:, timestamp=1265207385421, value=237500
 3                           column=CountryCode:, timestamp=1265207385453, value=AFG
 3                           column=ID:, timestamp=1265207385437, value=3
 3                           column=Name:, timestamp=1265207385437, value=Herat
 3                           column=Population:, timestamp=1265207385468, value=186800
3 row(s) in 0.0310 seconds
SELECT * FROM City;
データの検索(範囲指定)
  • HBase
hbase(main):050:0> scan 'City', {STARTROW => '1', STOPROW => '3'}
ROW                          COLUMN+CELL
 1                           column=CountryCode:, timestamp=1265205866562, value=AFG
 1                           column=ID:, timestamp=1265205853640, value=1
 1                           column=Name:, timestamp=1265205860375, value=Kabul
 1                           column=Population:, timestamp=1265205872140, value=1780000
 2                           column=CountryCode:, timestamp=1265207385421, value=AFG
 2                           column=ID:, timestamp=1265207385390, value=2
 2                           column=Name:, timestamp=1265207385390, value=Qandahar
 2                           column=Population:, timestamp=1265207385421, value=237500
2 row(s) in 0.0310 seconds
SELECT * FROM City WHERE ID between 1 and 2;
データの検索(列全て)
  • HBase
hbase(main):019:0> get 'City', '2'
COLUMN                       CELL
 CountryCode:                timestamp=1265206057406, value=AFG
 ID:                         timestamp=1265206057375, value=2
 Name:                       timestamp=1265206057390, value=Qandahar
 Population:                 timestamp=1265206058359, value=237500
4 row(s) in 0.0160 seconds
SELECT * FROM City WHERE ID = 2;
データの検索(列指定)
  • HBase
hbase(main):022:0> get 'City', '2', {COLUMN => 'Name'}
COLUMN                       CELL
 Name:                       timestamp=1265206057390, value=Qandahar
1 row(s) in 0.0150 seconds
SELECT Name FROM City WHERE ID = 2;
データの削除(項目削除)
  • HBase
delete 'City', '2', 'Name'
UPDATE City SET Name = null WHERE ID = 2;
データの削除(行削除)
  • HBase
deleteall 'City', '2'
DELETE FROM City WHERE ID = 2;
データの削除(一括削除)

HBaseのtrancateの内部処理はdisable,drop,createとなっています。

  • HBase
trancate 'City'
TRANCATE TABLE City;

最後に

さて、ここまででHBase Shellの基本操作を勉強しました。
RDB使いの皆さんはRDBと操作が違ってメンドクセと思われたかもしれません。
上記では時間の都合で取り上げませんでしたがHadoopはデータを2次元の表ではなく多次元で持ちます。
(時間が出来たら追記します。。)


実はここまで読ませておきながら何なんですが・・・
HadoopにはRDBのようなSQLライクにMapReduce操作ができるHiveという別プロダクトがあります。
HiveはFacebookが開発を始めたプロダクトで
2008年12月に正式にHadoopプロジェクトにcontributeされました。
その他にも色々なプロジェクトがありますので興味がありましたら調べて頂ければと思います。