HBase 基礎文法最速マスター
基礎文法最速マスターが流行のようなので、
便乗して勉強がてらにHBaseの基本操作について纏めてみます。
これを読めばGoogleのBigTableのクローンである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基本操作 - 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独自)
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;
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 Shellの基本操作を勉強しました。
RDB使いの皆さんはRDBと操作が違ってメンドクセと思われたかもしれません。
上記では時間の都合で取り上げませんでしたがHadoopはデータを2次元の表ではなく多次元で持ちます。
(時間が出来たら追記します。。)
実はここまで読ませておきながら何なんですが・・・
HadoopにはRDBのようなSQLライクにMapReduce操作ができるHiveという別プロダクトがあります。
HiveはFacebookが開発を始めたプロダクトで
2008年12月に正式にHadoopプロジェクトにcontributeされました。
その他にも色々なプロジェクトがありますので興味がありましたら調べて頂ければと思います。