ベンチマーク取る為にYCSBをインストールする手順

**昔、MongoDBのベンチマークをYCSBを使って取った時のメモです**

## YCSBとは
YCSB(Yahcoo Cloud Serving Benchmark)とは、ざっくり言うとYahoo!が作っている
NoSQL向けのベンチマークツールです。
[YCSBプロジェクトGitレポ](https://github.com/brianfrankcooper/YCSB)
[YCSB Wiki](https://github.com/brianfrankcooper/YCSB/wiki)

## YCSBの導入手順
### 導入環境
- CentOS6.5

### 必要なパッケージ
#### Java

```
# 今回はjava-1.7.0-openjdkを入れました
$ yum search java
$ yum install java-1.7.0-openjdk-devel.x86_64

```

#### Maven

```
# 今回は、apache-maven-3.2.1を入れました
$ cd /usr/local/src/
$ wget http://www.motorlogy.com/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.zip
$ unzip apache-maven-3.2.1-bin.zip
$ mv apache-maven-3.2.1/ /opt/maven
$ ln -s /opt/maven/bin/mvn /usr/bin/mvn

# mvnのパス設定する（PATH=$MAVEN_HOME/bin:$PATH）
$ viｍ /etc/profile.d/maven.sh
#!/bin/bash
MAVEN_HOME=/opt/maven
PATH=$MAVEN_HOME/bin:$PATH
export PATH MAVEN_HOME
export CLASSPATH=.
chmod +x /etc/profile.d/maven.sh
source /etc/profile.d/maven.sh

mvnのバージョン確認（パスが通ってるのも）
$ mvn -version

```

#### YCSB

```
# YCSBのインストールにgitコマンドを使うので、もしなければインストールします
$ yum install git

# YCSBをgitレポからcloneしてくる
$ git clone git://github.com/brianfrankcooper/YCSB.git

# YCSBディレクトリへ移動
$ cd YCSB

# このままだとmapkeeperのビルドにコケるので、pom.xmlを編集する
# 編集する前にバックアップとっておく
$ cp pom.xml pom.xml.bk

# 下記の2行をコメントアウトしておく
vim pom.xml
<!--<mapkeeper.version>1.0</mapkeeper.version>--> 
<!--<module>mapkeeper</module>-->

$ mvn clean package

```

## 簡単な使い方

### YCSBコマンドは、ヘルプで確認出来ます

```
$ cd YCSB
$ ./bin/ycsb -h

```

### ベンチマーク取る前の準備
#### YCSBの設定ファイルを編集する

```
$ cd YCSB
$ vim workloads/workloada
```
##### 簡単な設定項目
|項目                     |   設定内容                                      　　 |
|:------------------------|:----------------------------------------------------|
|recordcount	          |ロードフェーズで挿入するデータのレコード数               |
|operationcount	          |トランザクションフェーズで実行されるクエリの回数          |
|workload	          |workloadを実行するクラス                               |
|fieldcount	          |1レコードあたりのフィールド数                           |
|fieldlength	          |各フィールドのサイズ                                    |
|readallfileds	          |レコード内の全フィールドを読むのか(true)、1つだけにするか(false)|
|readproportion           |全operationに対する読込の割合                            |
|updateproportion         |	全operationに対する更新の割合                      |
|insertproportion         |	全operationに対する挿入の割合                      |
|scanproportion	          |全operationに対するスキャンの割合                         |
|readmodifywriteproportion|	全operationに対する読込、修正、更新の割合              |
|requestdistribution	  |リクエスト分布方式、uniform、zipfian、latestから選択         |
|maxscanlength	          |スキャンする際の最大レコード数                               |
|scanlengthdistribution	 |スキャンするためのレコード数と各スキャンでのリクエスト分布方式   |
|insertorder	         |データ挿入する順序。キー順(ordered)かハッシュ順(hashed)        |


#### ベンチ実行
今回はmongodbで行った時のコマンドを載せてます。
mongodbとなっている部分はそれぞれredisなどベンチとりたいDBに変えてください

```
# コレクションの作成
$ ./bin/ycsb load mongodb -s -P workloads/workloada

# ベンチマーク実行
$ ./bin/ycsb run mongodb -s -P workloads/workloada
```

### おまけ
今回は、自分はMongoDBのベンチマーク取るのに使ったので、おまけにその時に使ったコマンドも
メモとして書いておきました。（port番号は、よしなに変更して下さい）

```
# データベース（ycsb）のusertable内のコレクション中身を確認する
$ echo 'db.usertable.findOne()' | mongo localhost:27017/ycsb

# データベース（ycsb）のusertable内のコレクション数を数える
$ echo 'db.usertable.count()' | mongo localhost:27017/ycsb

# ドキュメントサイズの確認
$ echo 'Object.bsonsize(db.usertable.findOne())' | mongo localhost:27017/ycsb 

# コレクションの中身を空にする
$ echo 'db.usertable.remove()' | mongo localhost:27017/ycsb 
```