HBaseをインストールしてCRUDしてみる

HBaseをインストールして、hbase shellからCRUDしてみたメモです。


HBase 1.2.0をインストールして、コマンドラインツールのhbase shellからCRUDを試してみました。

下記環境で試してみます。
・Windows10
VirtualBox 5.2.16
・cdh5.13.0 (HBase 1.2.0)

インストール

clouderaのディストリビューションを使用してみます。

下記ページからVM別のイメージがダウンロード出来るので、VirtualBox用のイメージをダウンロードしました。
試した時点のバージョンはcdh5.13.0です。
https://www.cloudera.com/downloads/quickstart_vms/5-13.html

cloudera-quickstart-vm-5.13.0-0-virtualbox.zip

zipを解凍し、
cloudera-quickstart-vm-5.13.0-0-virtualbox.ovfをvirtualvoxで起動します。
VMを起動するとHBaseも起動します。

ユーザは
cloudera/clouderaでログインできます。

確認

HBase shellというツールでコマンドを試してみます。

HBase shell起動

$ hbase shell
2018-07-24 11:01:03,300 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.13.0, rUnknown, Wed Oct  4 11:16:18 PDT 2017

バージョンとステータス確認

> version
1.2.0-cdh5.13.0, rUnknown, Wed Oct  4 11:16:18 PDT 2017

> status
1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
namespace, table作成

namespaceとtableを作成します。
それぞれmyspace, mytableという名前で作成してみます。

> create_namespace 'myspace'
0 row(s) in 0.1810 seconds

確認。
list_namespaceでnamespaceを表示。
(デフォルトで作成されているnamespaceも表示されます)

> list_namespace
NAMESPACE
default
hbase
myspace
3 row(s) in 0.0250 seconds

existsで対象のtableが存在するか確認。

> exists 'myspace:mytable'
Table myspace:mytable does exist
0 row(s) in 0.0130 seconds

テーブル定義確認。
describeで'myspace:mytable'のテーブル定義表示。

> describe 'myspace:mytable'
Table myspace:mytable is ENABLED
myspace:mytable
COLUMN FAMILIES DESCRIPTION
{NAME => 'myfamily', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER',
 KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
column family作成

column familyを作成します。
myfamilyという名前で作成してみます。
VERSIONSを指定して3世代データを持つようにします。

> create 'myspace:mytable', {NAME => 'myfamily', VERSIONS => 3}
0 row(s) in 1.3820 seconds

=> Hbase::Table - myspace:mytable

listでテーブルが作成されていることを確認。

> list
TABLE
myspace:mytable
1 row(s) in 0.0190 seconds

=> ["myspace:mytable"]
データ追加

putでrowを追加してみます。

row='row1', column='myfamily:name', value='Alice'
のrowを追加してみます。

> put 'myspace:mytable', 'row1', 'myfamily:name', 'Alice'
0 row(s) in 0.1190 seconds

getでrowを確認。
追加したrowを指定し確認してみます。

> get 'myspace:mytable', 'row1'
COLUMN                                        CELL
 myfamily:name                                timestamp=1532455757730, value=Alice
1 row(s) in 0.0130 seconds
データ更新

putでrowを更新してみます。

row2を追加。

> put 'myspace:mytable', 'row2', 'myfamily:name', 'Bob'
0 row(s) in 0.0030 seconds

同じrow2に対してvalueを変えてputします。

> put 'myspace:mytable', 'row2', 'myfamily:name', 'Bobby'
0 row(s) in 0.0040 seconds

getで確認すると最新のデータが取得できます。

> get 'myspace:mytable', 'row2', 'myfamily:name'
COLUMN                                        CELL
 myfamily:name                                timestamp=1532455904780, value=Bobby
1 row(s) in 0.0070 seconds

さらに同じrow2に対してvalueを変えてputします。

> put 'myspace:mytable', 'row2', 'myfamily:name', 'Bobbiee'
0 row(s) in 0.0040 seconds

getで確認すると最新のデータが取得できます。

> get 'myspace:mytable', 'row2', 'myfamily:name'
COLUMN                                        CELL
 myfamily:name                                timestamp=1532455975592, value=Bobbiee
1 row(s) in 0.0120 seconds

getでVERSIONSを指定すると保持しているtimestampの古いバージョンを表示出来ます。

> get 'myspace:mytable', 'row2', COLUMN => 'myfamily:name', VERSIONS => 2
COLUMN                                        CELL
 myfamily:name                                timestamp=1532455975592, value=Bobbiee
 myfamily:name                                timestamp=1532455904780, value=Bobby
2 row(s) in 0.0070 seconds

column family作成時に3世代持つようにVERSIONSを指定したので
3世代までget出来ます。

> get 'myspace:mytable', 'row2', COLUMN => 'myfamily:name', VERSIONS => 3
COLUMN                                        CELL
 myfamily:name                                timestamp=1532455975592, value=Bobbiee
 myfamily:name                                timestamp=1532455904780, value=Bobby
 myfamily:name                                timestamp=1532455899856, value=Bob
3 row(s) in 0.0070 seconds
scan

row3,row4,row5を追加。

> put 'myspace:mytable', 'row3', 'myfamily:name', 'Cindy'
> put 'myspace:mytable', 'row4', 'myfamily:name', 'Dan'
> put 'myspace:mytable', 'row5', 'myfamily:name', 'Goth'

scanで指定したテーブルの全rowの最新データを取得出来ます。

> scan 'myspace:mytable'
ROW                                           COLUMN+CELL
 row1                                         column=myfamily:name, timestamp=1532455757730, value=Alice
 row2                                         column=myfamily:name, timestamp=1532455975592, value=Bobbiee
 row3                                         column=myfamily:name, timestamp=1532543533581, value=Cindy
 row4                                         column=myfamily:name, timestamp=1532543551284, value=Dan
 row5                                         column=myfamily:name, timestamp=1532543571710, value=Goth
5 row(s) in 0.0210 seconds

scanでSTARTROW, STOPROWを指定すると、レンジスキャンが可能。

> scan 'myspace:mytable', STARTROW => 'row2', STOPROW => 'row5'
ROW                                           COLUMN+CELL
 row2                                         column=myfamily:name, timestamp=1532455975592, value=Bobbiee
 row3                                         column=myfamily:name, timestamp=1532543533581, value=Cindy
 row4                                         column=myfamily:name, timestamp=1532543551284, value=Dan
3 row(s) in 0.0140 seconds

ageのcolumnを追加。

> put 'myspace:mytable', 'row1', 'myfamily:age', 28
> put 'myspace:mytable', 'row2', 'myfamily:age', 19
> put 'myspace:mytable', 'row3', 'myfamily:age', 42
> put 'myspace:mytable', 'row4', 'myfamily:age', 38

確認。

> scan 'myspace:mytable'
ROW                                           COLUMN+CELL
 row1                                         column=myfamily:age, timestamp=1532544488031, value=28
 row1                                         column=myfamily:name, timestamp=1532455757730, value=Alice
 row2                                         column=myfamily:age, timestamp=1532544515162, value=19
 row2                                         column=myfamily:name, timestamp=1532455975592, value=Bobbiee
 row3                                         column=myfamily:age, timestamp=1532544523861, value=42
 row3                                         column=myfamily:name, timestamp=1532543533581, value=Cindy
 row4                                         column=myfamily:age, timestamp=1532544530476, value=38
 row4                                         column=myfamily:name, timestamp=1532543551284, value=Dan
 row5                                         column=myfamily:name, timestamp=1532543571710, value=Goth

scanでCOLUMNSを指定すると特定のcolumnのみ取得可能。

> scan 'myspace:mytable', STARTROW => 'row2', STOPROW => 'row5', COLUMNS => ['myfamily:age']
ROW                                           COLUMN+CELL
 row2                                         column=myfamily:age, timestamp=1532544515162, value=19
 row3                                         column=myfamily:age, timestamp=1532544523861, value=42
 row4                                         column=myfamily:age, timestamp=1532544530476, value=38
3 row(s) in 0.0310 seconds
データ削除

下記のrow6をput。

> put 'myspace:mytable', 'row6', 'myfamily:name', 'Heron'
> put 'myspace:mytable', 'row6', 'myfamily:age', 55
> put 'myspace:mytable', 'row6', 'myfamily:name', 'Heron!!'
> put 'myspace:mytable', 'row6', 'myfamily:age', 56
> put 'myspace:mytable', 'row6', 'myfamily:name', 'Heron123'
> put 'myspace:mytable', 'row6', 'myfamily:age', 57
> put 'myspace:mytable', 'row6', 'myfamily:name', 'HeronXXXXXX'
> put 'myspace:mytable', 'row6', 'myfamily:age', 58

> scan 'myspace:mytable'
ROW                                           COLUMN+CELL
 row1                                         column=myfamily:age, timestamp=1532544488031, value=28
 row1                                         column=myfamily:name, timestamp=1532455757730, value=Alice
 row2                                         column=myfamily:age, timestamp=1532544515162, value=19
 row2                                         column=myfamily:name, timestamp=1532455975592, value=Bobbiee
 row3                                         column=myfamily:age, timestamp=1532544523861, value=42
 row3                                         column=myfamily:name, timestamp=1532543533581, value=Cindy
 row4                                         column=myfamily:age, timestamp=1532544530476, value=38
 row4                                         column=myfamily:name, timestamp=1532543551284, value=Dan
 row5                                         column=myfamily:name, timestamp=1532543571710, value=Goth
 row6                                         column=myfamily:age, timestamp=1533236795416, value=58
 row6                                         column=myfamily:name, timestamp=1533236787029, value=HeronXXXXXX
6 row(s) in 0.0270 seconds

getでrow6を確認。
getでもCOLUMNSを指定すると特定のcolumnのみ取得可能。

> get 'myspace:mytable', 'row6', COLUMN => ['myfamily:name', 'myfamily:age'], VERSIONS => 3
COLUMN                                        CELL
 myfamily:age                                 timestamp=1533236795416, value=58
 myfamily:age                                 timestamp=1533236664596, value=57
 myfamily:age                                 timestamp=1533236655241, value=56
 myfamily:name                                timestamp=1533236787029, value=HeronXXXXXX
 myfamily:name                                timestamp=1533236659721, value=Heron123
 myfamily:name                                timestamp=1533236649467, value=Heron!!
6 row(s) in 0.0120 seconds

deleteで特定のcolumnを削除。
row6の'myfamily:age'のcolumnを削除。

> delete 'myspace:mytable', 'row6', 'myfamily:age'
0 row(s) in 0.0060 seconds

確認。
row6の'myfamily:age'のcolumnが削除されている。

> get 'myspace:mytable', 'row6', COLUMN => ['myfamily:name', 'myfamily:age'], VERSIONS => 3
COLUMN                                        CELL
 myfamily:name                                timestamp=1533236787029, value=HeronXXXXXX
 myfamily:name                                timestamp=1533236659721, value=Heron123
 myfamily:name                                timestamp=1533236649467, value=Heron!!
3 row(s) in 0.0080 seconds

再度rowをput。

> get 'myspace:mytable', 'row6', COLUMN => ['myfamily:name', 'myfamily:age'], VERSIONS => 3
COLUMN                                        CELL
 myfamily:age                                 timestamp=1533236902430, value=58
 myfamily:age                                 timestamp=1533236897589, value=57
 myfamily:age                                 timestamp=1533236893309, value=56
 myfamily:name                                timestamp=1533236787029, value=HeronXXXXXX
 myfamily:name                                timestamp=1533236659721, value=Heron123
 myfamily:name                                timestamp=1533236649467, value=Heron!!
6 row(s) in 0.0130 seconds

タイムスタンプを指定してrow6の'myfamily:age'をdeleteする(value=57のrow)

> delete 'myspace:mytable', 'row6', 'myfamily:age', 1533236897589
0 row(s) in 0.0100 seconds

指定したtimestampより古いrow6の'myfamily:age'が削除される。

> get 'myspace:mytable', 'row6', COLUMN => ['myfamily:name', 'myfamily:age'], VERSIONS => 3
COLUMN                                        CELL
 myfamily:age                                 timestamp=1533236902430, value=58
 myfamily:name                                timestamp=1533236787029, value=HeronXXXXXX
 myfamily:name                                timestamp=1533236659721, value=Heron123
 myfamily:name                                timestamp=1533236649467, value=Heron!!
4 row(s) in 0.0140 seconds

deleteallでrow6全体を削除。

> deleteall 'myspace:mytable', 'row6'
0 row(s) in 0.0090 seconds

row6が削除されていることを確認。

> get 'myspace:mytable', 'row6', COLUMN => ['myfamily:name', 'myfamily:age'], VERSIONS => 3
COLUMN                                        CELL
0 row(s) in 0.0060 seconds

他のrowが削除されてないことを確認。

> scan 'myspace:mytable'
ROW                                           COLUMN+CELL
 row1                                         column=myfamily:age, timestamp=1532544488031, value=28
 row1                                         column=myfamily:name, timestamp=1532455757730, value=Alice
 row2                                         column=myfamily:age, timestamp=1532544515162, value=19
 row2                                         column=myfamily:name, timestamp=1532455975592, value=Bobbiee
 row3                                         column=myfamily:age, timestamp=1532544523861, value=42
 row3                                         column=myfamily:name, timestamp=1532543533581, value=Cindy
 row4                                         column=myfamily:age, timestamp=1532544530476, value=38
 row4                                         column=myfamily:name, timestamp=1532543551284, value=Dan
 row5                                         column=myfamily:name, timestamp=1532543571710, value=Goth
5 row(s) in 0.0160 seconds


========================================================================================
[メモ]
VMをシャットダウンして、再度起動してhbase shellでログインしてコマンドを打つと下記エラーになってしまった。

> status

ERROR: Can't get master address from ZooKeeper; znode data == null

ここに書いてあった
https://community.cloudera.com/t5/Storage-Random-Access-HDFS/HBase-Can-t-get-master-address-from-ZooKeeper-I-am-getting/td-p/29935

Masterの場合

service hbase-master restart

Region Serverの場合

service hbase-regionserver restart

下記の通りHBaseを再起動。
Master再起動

$ sudo service hbase-master restart
no master to stop because no pid file /var/run/hbase/hbase-hbase-master.pid
Stopped HBase master daemon:                               [  OK  ]
starting master, logging to /var/log/hbase/hbase-hbase-master-quickstart.cloudera.out
Started HBase master daemon (hbase-master):

Region Server再起動

$ sudo service hbase-regionserver restart
Restarting Hadoop HBase regionserver daemon: Stopping Hadoop HBase regionserver daemon: no regionserver to stop because no pid file /var/run/hbase/hbase-hbase-regionserver.pid
hbase-regionserver.
Starting Hadoop HBase regionserver daemon: starting regionserver, logging to /var/log/hbase/hbase-hbase-regionserver-quickstart.cloudera.out
hbase-regionserver.

直った

> status
1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load


終わり。