YCSBでDynamoDBを殴ってみた

2015.07.31

なんだかんだと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_·_AWS_Console

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件投入されていることが確認出来ます。

DynamoDB_·_AWS_Console 2

ベンチマークの実行

ベンチマークの実行には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しかできないため、本格的なデータをとりたいならばかなり深い部分までカスタマイズが必要になると思います。