YCSBでDynamoDBを殴ってみた
なんだかんだとRDBよりKVSが好きな渡辺です。
今回は、YCSB(Yahoo! Cloud System Benchmark)でDynamoDBにベンチマークテストを試してみようと思います。YCSBの売りは様々なクラウドKVSのベンチマークを計測できる点にあります。 しかし、KVSはプロダクトによって癖が強く、同じデータで同じような負荷をかけても一色単に比較できるというわけでもありません。最適な使い方をしているかどうかを見極めなければならないことは注意してください。
YCSBの準備
YCSBはJavaで書かれてあり、Mavenでビルドします。Amazon Linux上にYCSBをインストールするという前提で、セットアップしていきましょう。
JDKのインストール
Amazon LinuxにインストールされているのはJREなのでJDKをインストールします。
$ sudo yum -y install java-1.7.0-openjdk-devel git
Mavenの取得
MavenはJavaのビルドツールです。アーカイブを展開し、Pathを通します。
$ curl -O http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz
展開してパスを通します。
$ tar xzvf apache-maven-3.3.3-bin.tar.gz
.bash_profileに追記します。
MAVEN_HOME=~/apache-maven-3.3.3 PATH=$PATH:$MAVEN_HOME/bin
反映も忘れずに。
$ source .bash_profile
YCSBの取得とビルド
Githubからソースを取得してMavenでビルドします。
$ git clone https://github.com/brianfrankcooper/YCSB.git $ cd YCSB/ $ mvn clean package
依存ライブラリの取得などがありますので、3−5分程度はかかります。Mavenを実行中にDynamoDBを準備しておきましょう。
DynamoDBのセットアップ
YCSBでは、デフォルトでusertableというテーブルを作りベンチマークを測定します。 マネジメントコンソールでDynamoDBを開き、usertableテーブルを作成してください。Primary KeyはHashを選択し、firstname (String) を設定します。
DynamoDBではテーブル作成時にPrimary Keyとインデックスを設定する必要がありますが、他のフィールドは設定する必要はありません。今回はとりあえず試してみるだけなのでインデックスも不要です。
読み込み/書き込みの性能に関連するCapacity Unitはとりあえず最小値の1を設定しておきます。
設定ファイルの準備
YCSBのビルドが終わったならば、設定ファイルを編集していきます。 必要となるのは、ベンチマークを取るときの設定のベースとなるworkload、DynamoDBの設定を記述するdynamodb.properties、AWSのクレデンシャルを設定するAWSCredentials.properties です。
workload
workloadはどのようなテーブルに、どんなデータをどのくらい作成し、どのような負荷をかけるかを記述する設定ファイルです。workloads/workloada を参考に設定を行います。 workloads/first_attack
recordcount=100 operationcount=300 workload=com.yahoo.ycsb.workloads.CoreWorkload readallfields=true readproportion=0.95 updateproportion=0.05 scanproportion=0 insertproportion=0 requestdistribution=zipfian
ここでは、100件だけレコードを作成し、300回殴ります。比率としてはReadが95%、Updateが5%です。
dynamodb/conf/dynamodb.properties
DynamoDBの設定を行います。
dynamodb.awsCredentialsFile = dynamodb/conf/AWSCredentials.properties dynamodb.primaryKey = firstname dynamodb.endpoint = http://dynamodb.ap-northeast-1.amazonaws.com
awsCredentialsFileの場所は、YCSBのルートディレクトリ(実行ディレクトリ)からの相対パスですdynamodb.propertiesと同じディレクトリにあることを想定しています。primaryKeyはHashで設定したPrimaryKeyです。Hash & Rangeは現時点ではYCSBのDynamoDBプラグインでは対応していないようでした。endpointはデフォルトがus-east-1になっているのでap-northeast-1に変更します。
dynamodb/conf/AWSCredentials.properties
アクセスキーとシークレットキーの設定なんてやりたくないんですが、IAM Roleには対応していないのでDynamoDBにアクセス可能なアクセスキーを設定してください。
以上で準備完了です。
データの投入
データの投入には、loadコマンドを使います。
$ ./bin/ycsb load dynamodb -P workloads/first_attack -P dynamodb/conf/dynamodb.properties
パラメータとして、WorkloadとDynamoDBのプロパティを指定してください。loadに成功すれば、次のようにランダム文字列のデータが1,000件投入されていることが確認出来ます。
ベンチマークの実行
ベンチマークの実行にはrunコマンドを使います。
$ ./bin/ycsb run dynamodb -P workloads/first_attack -P dynamodb/conf/dynamodb.properties [OVERALL], RunTime(ms), 3866.0 [OVERALL], Throughput(ops/sec), 77.5995861355406 [READ], Operations, 284 [READ], AverageLatency(us), 11911.820422535211 [READ], MinLatency(us), 7684 [READ], MaxLatency(us), 198532 [READ], 95thPercentileLatency(ms), 18 [READ], 99thPercentileLatency(ms), 27 [UPDATE], Operations, 16 [UPDATE], AverageLatency(us), 15665.25 [UPDATE], MinLatency(us), 12168 [UPDATE], MaxLatency(us), 24913 [UPDATE], 95thPercentileLatency(ms), 24 [UPDATE], 99thPercentileLatency(ms), 24
実行結果としては、スループットが77.59 [ops/sec] 、Readの95%タイルで18msec、Updateの95%タイルで24msecと読み取れます。
まとめ
YCSBを使うことで、適当なテーブルを作ってDynamoDBを殴ることができます。が、単に殴るだけではあまり意味がありません。パラメータを調整したり、実際に使うテーブルスキーマに近づけるようにworkloadをカスタマイズする必要があるでしょう。 特に、YCSBはqueryは対応しておらず単純なscanしかできないため、本格的なデータをとりたいならばかなり深い部分までカスタマイズが必要になると思います。