iMind Developers Blog

iMind開発者ブログ

hbase shellのコマンドまとめ

概要

HBaseを使う際のコマンドをhbase shellでちょっと確認。

バージョン情報

  • HBase 1.2.0

hbase shellの起動

$ hbase shell

helpの参照

> help

機能ごとのhelpの参照。下記はcreateの例。

> help 'create'

テーブル生成

exampleテーブルの生成。

> create 'example', 'col1', 'col2', 'col3'

TTL(time to live)を設定してテーブルをcreate。下記は60秒でデータがexpireされる設定。

> create 'example',
        {'NAME' => 'col1', 'TTL' => 60},
        {'NAME' => 'col2', 'TTL' => 60},
        {'NAME' => 'col3', 'TTL' => 60}  

compressionも設定してテーブルをcreate。デフォルトはNone、下記はSNAPPYで圧縮。

> create 'example', 
        {'NAME' => 'col1', 'TTL' => 60, 'COMPRESSION' => 'SNAPPY'},
        {'NAME' => 'col2', 'TTL' => 60, 'COMPRESSION' => 'SNAPPY'},
        {'NAME' => 'col3', 'TTL' => 60, 'COMPRESSION' => 'SNAPPY'}

テーブル一覧確認

> list

実行結果

=> ["test"]

テーブル存在チェック

> exists 'example'

実行結果

Table example does exist 

テーブル詳細確認

> describe 'example'

実行結果

Table example is ENABLED                                                                                                                                                              
example                                                                                                                                                                               
COLUMN FAMILIES DESCRIPTION                                                                                                                                                           
{NAME => 'col1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => '60 SECONDS (1 MINUTE)', COMPRESSIO
N => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                             
{NAME => 'col2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => '60 SECONDS (1 MINUTE)', COMPRESSIO
N => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                             
{NAME => 'col3', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => '60 SECONDS (1 MINUTE)', COMPRESSIO
N => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}

テーブル削除

テーブルを削除する際はdisableしてからdropする。

> disable 'example'
> drop 'example'

disableしていないと下記のようなエラーが出る。

ERROR: Table example is enabled. Disable it first.

データの投入

> put 'example', 'key1', 'col1:qualifier1', 'value1'

データの取得

> get 'example', 'key1', 'col1'

実行結果

 col1:qualifier1                timestamp=1554880871720, value=value1

データのScan

事前にrow keyを変えつつ5件データを入れておく。

> put 'example', 'key2', 'col1:qualifier2', 'value2'
> put 'example', 'key3', 'col1:qualifier3', 'value3'
> put 'example', 'key4', 'col1:qualifier4', 'value4'
> put 'example', 'key5', 'col1:qualifier5', 'value5'

3件取得

> scan 'example', {LIMIT => 3}
 key1                           column=col1:qualifier1, timestamp=1554880871720, value=value1
 key2                           column=col1:qualifier2, timestamp=1554881151686, value=value2
 key3                           column=col1:qualifier3, timestamp=1554881155305, value=value3

指定期間のデータを取得。3〜5のtimestampを指定してみる。

> scan 'example', 
    {COLUMNS => 'col1', TIMERANGE => [1554881155305, 1554881160883]}
 key3                           column=col1:qualifier3, timestamp=1554881155305, value=value3
 key4                           column=col1:qualifier4, timestamp=1554881158285, value=value4

キーの前方一致。

> scan 'example', {ROWPREFIXFILTER => 'key'}

Scan + ValueFilter

ValueFilterでvalue4より大きいものを取得する。

> scan 'example', {FILTER => "ValueFilter (>=, 'binary:value4')"}
 key4                           column=col1:qualifier4, timestamp=1554881158285, value=value4
 key5                           column=col1:qualifier5, timestamp=1554881160883, value=value5

Scan + QualifyFilter

QualifyFilterでqualifyの名前を指定して取得。

> scan 'example', {FILTER => "QualifierFilter(=, 'binary:qualifier2')"}
 key2                           column=col1:qualifier2, timestamp=1554881151686, value=value2

利用できるフィルタの一覧

下記コマンドで一覧を取得できる。

> show_filters

レコードの行数取得

> count 'example'
5 row(s) in 0.0700 seconds

データの削除

指定familyの指定cellを削除。

> delete 'example', 'key1', 'col1:qualifier1'

指定row keyをまとめて削除。

# 同一familyを2つ、入れておく
> put 'example', 'key6', 'col3:qualifier1', 'value1'
> put 'example', 'key6', 'col3:qualifier2', 'value2'
> scan 'example', {COLUMNS => ['col3']}

# 同一row keyをまとめて削除
> deleteall 'example', 'key6'

テーブルのtruncate

> truncate 'example'

truncateは内部的にはテーブルをdisableしてdropしてcreateしている。

データのインクリメント

# 1回目
> incr 'example', 'key7', 'col3:qualifier2', 1
COUNTER VALUE = 1

# 2回目
> incr 'example', 'key7', 'col3:qualifier2', 1
COUNTER VALUE = 2

# 3回目
> incr 'example', 'key7', 'col3:qualifier2', 1
COUNTER VALUE = 3

数値のput

CLIでは入れた値は文字列で送られてしまうので、例えば下記のように数値を入れたつもりでincrしても、Longでないvalueをincrしようとしていると扱われエラーになる。

> put 'example', 'key7', 'col3:qualifier2', 1
> incr 'example', 'key7', 'col3:qualifier2', 1

    #=> ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 1 bytes wide

数値を入れる方法として、Bytesの表現でLongの数値を記述する方法や

> > put 'example', 'key7', 'col3:qualifier2', "\x00\x00\x00\x00\x00\x00\x00\x00"

Longs.toBytesArrayの結果を文字列にして渡す方法などがある。

import com.google.common.primitives.Longs
long_one = java.lang.String.new(Longs.toByteArray(1))
put 'example', 'key7', 'col3:qualifier2', long_one

テーブル名の変更

テーブル名:exampleをexample2に変更する。snapshotを取ってそこから新しいテーブルを生成し、古いテーブルを削除する流れらしい。

# 処理する前にdisableに
> disable 'example

# スナップショット生成
> snapshot 'example', 'example_snapshot'

# スナップショットから新規テーブル生成
> clone_snapshot 'example_snapshot', "example2"

# スナップショット削除
> delete_snapshot 'example_snapshot'

# 元テーブル削除
> drop 'example'

namespaceの新規作成

> create_namespace 'ns1'

namespaceの一覧表示

> list_namespace

namespaceに所属するテーブル一覧表示

下記はネームスペース:ns1に所属しているテーブルの一覧を表示する。

> list_namespace_tables 'ns1'

namespaceにテーブルを追加

テーブルをcreateする際に、テーブル名を「namespace_name:table_name」のようにコロンで区切れば指定namespace配下のテーブルになる。

既存のテーブルを移す場合は、rename時の要領でnamespaceにtableを参加させる。

# 処理する前にdisableに
> disable 'example

# スナップショット生成
> snapshot 'example', 'example_snapshot'

# スナップショットから新規テーブル生成
> clone_snapshot 'example_snapshot', "ns1:example"

# スナップショット削除
> delete_snapshot 'example_snapshot'

# 元テーブル削除
> drop 'example'

改定履歴

Author: Masato Watanabe, Date: 2019-04-20, 記事投稿