YCSB で HBase のベンチマーク

YCSB (Yahoo! Cloud Serving Benchmark) はクラウドサービスで使用される様々なデータストアのベンチマークプログラム。Apache 2 ライセンスで配布されており HBase, BigTable, Cassandra, MongoDB, CouchDB, Dynomite, Redis などほとんどの NoSQL 系データストアに対応しています。

ただいま HBase の性能検証を行なっているので YCSB を使ってみます。

手順

ビルド

YCSB は実行形式での配布はされていないようなので github からソースを持ってきてビルドします。git, Java (6 で動いた), Apache Ant と HBase のライブラリが必要です。

torao@clove$ git clone git://github.com/brianfrankcooper/YCSB.git
torao@clove$ cd YCSB
torao@clove$ cp /usr/lib/hbase/hbase*.jar db/hbase/lib
torao@clove$ cp /usr/lib/hbase/lib/*.jar db/hbase/lib
torao@clove$ ant
torao@clove$ ant dbcompile-hbase
テーブル作成

HBase Shell からベンチマークで使用するテーブルを作成します。usertable は固定値で family 部分が実行時に変更可能です。

torao@clove$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.90.4-cdh3u2, r, Thu Oct 13 20:32:26 PDT 2011
hbase(main):001:0> create 'usertable'.'family'
実行

リモートからの接続方法が分からず少々行き詰まる…。どうもこのツールは localhost 以外の接続先を選択する設定がない様子。ベンチマーク処理の負荷が加算されてしまうのが気になりますが、仕方が無いので ZooKeeper が動作しているノードで実行します。

torao@clove$ java -cp build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client -load -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p recordcount=1000000 -s > ycsb-load.log

まず -load オプションを指定して100万件のレコードを投入します。上記の操作で yscb-load.log には INSERT のベンチマークが保存されます。

torao@clove$ java -cp build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client -t -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p operationcount=1000000 -s > ycsb-test.log

次に -t オプションで100万オペレーションを実行します。yscb-test.log には UPDATE, READ のベンチマークが保存されます。-P オプションで指定したファイルは設定のデフォルト値と INSERT, UPDATE, READ, SCAN の負荷割合を定義しているので HBase の使用想定に合わせて選べば良いかと思います。

Workload A Update heavy workload
Workload B Read mostly workload
Workload C Read only
Workload D Read latest workload
Workload E Short ranges
Workload F Read-modify-write workload

その他、スレッド数や秒間実行回数の調整も行えますので java -cp build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client の結果を参照して下さい。

結果

リダイレクトされたファイルにはオペレーションの最小、最大、平均、95%、99% 時間とミリ秒ごとのヒストグラムが出力されます (us は μsec の意味)。

YCSB Client 0.1
Command line: -t -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p operationcount=1000000 -s -threads 10
[OVERALL], RunTime(ms), 83851.0
[OVERALL], Throughput(ops/sec), 11925.91620851272
[UPDATE], Operations, 499992
[UPDATE], AverageLatency(us), 434.1214899438391
[UPDATE], MinLatency(us), 1
[UPDATE], MaxLatency(us), 12981941
[UPDATE], 95thPercentileLatency(ms), 0
[UPDATE], 99thPercentileLatency(ms), 0
[UPDATE], Return=0, 499992
[UPDATE], 0, 499962
[UPDATE], 1, 0
[UPDATE], 2, 0
[UPDATE], 3, 0
…