#hadoopAC12jp Hadoop アドベントカレンダー 2012 5日目 HBase の便利ツール(1) HFile


Hadoop アドベントカレンダー 2012 空いているところ担当の shiumachi です。

今日は HFile という、HBase の中でもかなりマイナーなツールを紹介します。

概要

HBase のデータは HDFS 上に保存されています。

この HDFS 上のデータの基本単位は org.apache.hadoop.hbase.io.hfile.HFile クラスによって管理されます。

HFile クラス、実は実行可能です。

このクラスを使うことで、 HBase のストレージファイルに対する様々な調査を行うことができます。


聞いたことないという方が多いでしょうが、世の中の HBase ユーザの 99% は使わないツールですのでご安心ください。

ていうか多分私のようなサポート専用と言っていいです。

使い方

$ hbase org.apache.hadoop.hbase.io.hfile.HFile [option]

オプションなしで実行すると、以下のヘルプが表示されます。

usage: HFile [-a] [-b] [-e] [-f ] [-k] [-m] [-p] [-r ] [-s] [-v]
-a,--checkfamily Enable family check
-b,--printblocks Print block index meta data
-e,--printkey Print keys
-f,--file File to scan. Pass full-path; e.g.
hdfs://a:9000/hbase/.META./12/34
-k,--checkrow Enable row order check; looks for out-of-order keys
-m,--printmeta Print meta data of file
-p,--printkv Print key/value pairs
-r,--region Region to scan. Pass region name; e.g. '.META.,,1'
-s,--stats Print statistics
-v,--verbose Verbose output; emits file and meta data delimiters

以下に一覧を示します。

-f,--file HFile を指定する。 hdfs:///hbase/<テーブル名>/<リージョンのハッシュ>/<列ファミリ名>/ と指定。分からない場合は hdfs dfs -ls コマンド等で調べること
-p,--printkv key/value のペアを出力する
-e,--printkey key を出力する。 -k でないことに注意
-s,--stats 統計データを出力する
-b,--printblocks ブロックインデックスメタデータを出力する
-k,--checkrow 行の順番をチェックし、おかしな順番になっていないか確認
-m,--printmeta メタデータを出力する
-v,--verbose 冗長出力。だけどあまり有用な情報を見たことがない
-a,--checkfamily よくわからん
-r,--region よくわからん

-p の出力例

$ hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f /hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990
K: r1/cf1:c1/1354710249455/Put/vlen=2 V: 10
K: r1/cf1:c1/1354710244887/Put/vlen=1 V: 9
K: r1/cf1:c1/1354710240363/Put/vlen=1 V: 8
K: r1/cf1:c2/1354710307220/Put/vlen=2 V: 10
K: r1/cf1:c2/1354710302654/Put/vlen=1 V: 9
K: r1/cf1:c2/1354710297945/Put/vlen=1 V: 8
K: r10/cf1:c2/1354710424806/Put/vlen=2 V: 10
K: r10/cf1:c2/1354710415263/Put/vlen=1 V: 9
K: r10/cf1:c2/1354710410732/Put/vlen=1 V: 8
K: r10/cf1:c3/1354710508745/Put/vlen=2 V: 10
K: r10/cf1:c3/1354710504211/Put/vlen=1 V: 9
K: r10/cf1:c3/1354710494517/Put/vlen=1 V: 8
K: r4/cf1:c2/1354710341802/Put/vlen=1 V: 5
K: r8/cf1:c3/1354710366975/Put/vlen=1 V: 6
K: r9/cf1:c3/1354710374004/Put/vlen=1 V: 3
Scanned kv count -> 15

-e の出力例

$ hbase org.apache.hadoop.hbase.io.hfile.HFile -e -f /hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990
K: r1/cf1:c1/1354710249455/Put/vlen=2
K: r1/cf1:c1/1354710244887/Put/vlen=1
K: r1/cf1:c1/1354710240363/Put/vlen=1
K: r1/cf1:c2/1354710307220/Put/vlen=2
K: r1/cf1:c2/1354710302654/Put/vlen=1
K: r1/cf1:c2/1354710297945/Put/vlen=1
K: r10/cf1:c2/1354710424806/Put/vlen=2
K: r10/cf1:c2/1354710415263/Put/vlen=1
K: r10/cf1:c2/1354710410732/Put/vlen=1
K: r10/cf1:c3/1354710508745/Put/vlen=2
K: r10/cf1:c3/1354710504211/Put/vlen=1
K: r10/cf1:c3/1354710494517/Put/vlen=1
K: r4/cf1:c2/1354710341802/Put/vlen=1
K: r8/cf1:c3/1354710366975/Put/vlen=1
K: r9/cf1:c3/1354710374004/Put/vlen=1
Scanned kv count -> 15

-s の出力例

$ hbase org.apache.hadoop.hbase.io.hfile.HFile -s -f /hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990
Stats:
Key length: count: 15 min: 19 max: 20 mean: 19.4
Val length: count: 15 min: 1 max: 2 mean: 1.2666666666666666
Row size (bytes): count: 5 min: 28 max: 176 mean: 86.0
Row size (columns): count: 5 min: 1 max: 6 mean: 3.0
Key of biggest row: r9

-b の出力例

$ hbase org.apache.hadoop.hbase.io.hfile.HFile -b -f /hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990
Block Index:
size=1
key=r1/cf1:c1/1354710249455/Put
offset=0, dataSize=469

-m の出力例

$ hbase org.apache.hadoop.hbase.io.hfile.HFile -m -f /hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990
Block index size as per heapsize: 408
reader=/hbase/t1/03932f5c9d154176eef820f5e66078ea/cf1/8568e60d7ff9430883bb7d569d48b990,
compression=none,
cacheConf=CacheConfig:enabled [cacheDataOnRead=true] [cacheDataOnWrite=false] [cacheIndexesOnWrite=false] [cacheBloomsOnWrite=false] [cacheEvictOnClose=false] [cacheCompressed=false],
firstKey=r1/cf1:c1/1354710249455/Put,
lastKey=r9/cf1:c3/1354710374004/Put,
avgKeyLen=19,
avgValueLen=1,
entries=15,
length=1021
Trailer:
fileinfoOffset=549,
loadOnOpenDataOffset=469,
dataIndexCount=1,
metaIndexCount=0,
totalUncomressedBytes=965,
entryCount=15,
compressionCodec=NONE,
uncompressedDataIndexSize=32,
numDataIndexLevels=1,
firstDataBlockOffset=0,
lastDataBlockOffset=0,
comparatorClassName=org.apache.hadoop.hbase.KeyValue$KeyComparator,
version=2
Fileinfo:
KEY_VALUE_VERSION = \x00\x00\x00\x01
MAJOR_COMPACTION_KEY = \x00
MAX_MEMSTORE_TS_KEY = \x00\x00\x00\x00\x00\x00\x00\x00
MAX_SEQ_ID_KEY = 57
TIMERANGE = 1354710192056....1354710508745
hfile.AVG_KEY_LEN = 19
hfile.AVG_VALUE_LEN = 1
hfile.LASTKEY = \x00\x02r9\x03cf1c3\x00\x00\x01;k\x07\xD6t\x04
Mid-key: \x00\x02r1\x03cf1c1\x00\x00\x01;k\x05\xEF\xEF\x04
Bloom filter:
Not present

参考情報

馬本 p.353、「8.2.4 HFile のフォーマット」