概要
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, 記事投稿