ablog

不器用で落着きのない技術者のメモ

YCSB を Amazon KeySpaces にベンチマークをかけれるようカスタマイズしたメモ

YCSB(Yahoo! Cloud Serving Benchmark)を Amazon KeySpaces にベンチマークをかけれるようカスタマイズしたメモ。

前提

前提条件および環境セットアップ手順

Amazon Linux 2023 on EC2
  • Amazon Linux 2023 on EC2 を使用
  • OS ユーザーは ec2-user を使用
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
$ 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
    <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"