YCSB(Yahoo! Cloud Serving Benchmark)を Amazon KeySpaces にベンチマークをかけれるようカスタマイズしたメモ。
前提
前提条件および環境セットアップ手順
Python 2.7.18 がインストールされていること
- パッケージをインストール
$ sudo yum -y install git \ bzip2 \ bzip2-devel \ gcc \ git \ libffi-devel \ make \ openssl \ openssl-devel \ readline \ readline-devel \ sqlite \ sqlite-devel \ zlib-devel \ xz-devel
- pyenv をインストール
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
- パスを通す
$ cat << 'EOS' >> ~/.bashrc export PATH="~/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" EOS $ source ~/.bashrc
- patch コマンドをインストール
$ sudo yum -y install patch
- Python 2.7.18 をインストール
- オリジナルの YCSB は Python 3 に対応していないが、GitHub - yoheia/YCSB: Yahoo! Cloud Serving Benchmark は Port ycsb to Python3 and also make it Python2 compatible by adonis0147 · Pull Request #1421 · brianfrankcooper/YCSB · GitHub を取り込んで、Python 2 と 3 の両方に対応している。
$ pyenv install 2.7.18
- インストールした Python 2.7.18 が使われるよう設定する。
$ pyenv global 2.7.18 $ pyenv rehash
- 有効になっている Python のバージョンを確認する
$ pyenv versions system * 2.7.18 (set by /home/ec2-user/.pyenv/version)
OpenJDK 8 がインストールされていること
$ sudo yum install java-1.8.0-amazon-corretto-devel $ sudo alternatives --config java There are 2 programs which provide 'java'. Selection Command ----------------------------------------------- * 1 /usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java + 2 /usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64/jre/bin/java Enter to keep the current selection[+], or type selection number: 2 $ java -version openjdk version "1.8.0_382" OpenJDK Runtime Environment Corretto-8.382.05.1 (build 1.8.0_382-b05) OpenJDK 64-Bit Server VM Corretto-8.382.05.1 (build 25.382-b05, mixed mode)
Maven 3.9.4 がインストールされていること
$ curl -L -O https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz $ tar xvfz apache-maven-3.9.4-bin.tar.gz
~/.bashrc の編集
$ vi ~/.bashrc export JAVA_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64 export PATH=$PATH:/home/ec2-user/apache-maven-3.9.4/bin $ source ~/.bashrc
EC2 に KeySpaces へのアクセス権を持った IAM ロールがアタッチされていること(以下は例)
- IAM 権限 "AmazonKeyspacesFullAccess" をアタッチする
- 信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
cassandra_truststore.jks をダウンロードする
$ cd ~ $ mkdir -p .cassandra $ cd ~/.cassandra $ curl -L -O https://github.com/aws-samples/aws-sigv4-auth-cassandra-java-driver-examples/raw/master/cassandra_truststore.jks
YCSB のカスタマイズ・ビルド
- YCSB を入手する
$ pwd
/home/ec2-user
$ git clone https://github.com/yoheia/YCSB.git
- YCSB/cassandra/src/test を YCSB/cassandra/src/test.back にリネームする
- ビルド時にテストでこけるため
- 以下のファイルの cassandra 以外のセクションをコメントアウトする
- YCSB/pom.xml で cassandra.cql.version を編集する
<cassandra.cql.version>3.7.2</cassandra.cql.version>
- YCSB/cassandra/pom.xml に以下を追記する
<dependency> <groupId>software.aws.mcs</groupId> <artifactId>aws-sigv4-auth-cassandra-java-driver-plugin_3</artifactId> <version>3.0.3</version> </dependency>
<!-- <dependency> <groupId>org.cassandraunit</groupId> <artifactId>cassandra-unit</artifactId> <version>3.0.0.1</version> <classifier>shaded</classifier> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> --> <!-- only for Cassandra test (Cassandra 2.2+ uses Sigar for collecting system information, and Sigar requires some native lib files) --> <!-- <dependency> <groupId>org.hyperic</groupId> <artifactId>sigar-dist</artifactId> <version>1.6.4.129</version> <type>zip</type> <scope>test</scope> </dependency> -->
- YCSB/cassandra/src/main/java/site/ycsb/db/CassandraCQLClient.java を以下の通り編集する
- リージョンやエンドポイントはとりあえず直書きになっているので、リージョンに合わせて変更する
import software.aws.mcs.auth.SigV4AuthProvider; ... /* if ((username != null) && !username.isEmpty()) { Cluster.Builder clusterBuilder = Cluster.builder().withCredentials(username, password) .withPort(Integer.valueOf(port)).addContactPoints(hosts); if (useSSL) { clusterBuilder = clusterBuilder.withSSL(); } cluster = clusterBuilder.build(); } else { cluster = Cluster.builder().withPort(Integer.valueOf(port)) .addContactPoints(hosts).build(); } */ String endPoint = "cassandra.ap-northeast-1.amazonaws.com"; int portNumber = 9142; cluster = Cluster.builder() .addContactPoint(hosts) .withPort(Integer.valueOf(port)) .withAuthProvider(new SigV4AuthProvider("ap-northeast-1")) .withSSL() .build();
- ビルドする
$ mvn clean package
- YCSB/workloads/workloada_keyspaces を作成する
- workloada をコピーして以下を変更
recordcount=1000000 operationcount=100000000
cqlsh> create keyspace ycsb WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 }; cqlsh> USE ycsb; cqlsh> create table usertable ( y_id varchar primary key, field0 varchar, field1 varchar, field2 varchar, field3 varchar, field4 varchar, field5 varchar, field6 varchar, field7 varchar, field8 varchar, field9 varchar);
実行する
- データロード
$ ./bin/ycsb load cassandra-cql -p hosts=cassandra.ap-northeast-1.amazonaws.com -p port=9142 -P ./workloads/workloada_keyspaces -s \ -threads 8 -p cassandra.writeconsistencylevel=LOCAL_QUORUM -p cassandra.ssl=true \ -jvm-args=" -Djavax.net.ssl.trustStore=/home/ec2-user/.cassandra/cassandra_truststore.jks -Djavax.net.ssl.trustStorePassword=amazon"
- 実行する
$ ./bin/ycsb run cassandra-cql -p hosts=cassandra.ap-northeast-1.amazonaws.com -p port=9142 -P ./workloads/workloada_keyspaces -s \ -threads 256 -p cassandra.writeconsistencylevel=LOCAL_QUORUM -p cassandra.ssl=true \ -jvm-args=" -Djavax.net.ssl.trustStore=/home/ec2-user/.cassandra/cassandra_truststore.jks -Djavax.net.ssl.trustStorePassword=amazon"