Apache Cassandraの開発環境を構築する

# 概要

Apache Cassandraをソースからビルドして実行し、デバッグするところまで実施する手順を紹介します。
大まかには以下の流れです。

1. CentOSサーバーのセットアップ
1. ソースからCassandraをビルドする
1. IntelliJでCassandraを実行・デバッグしてみる
1. コミュニティに登録する

### 環境情報

Cassandraのビルドや実行は、CentOS7のサーバーで行います。そのため、virtualboxなどを用いて、CentOS7サーバを用意しておきます。Java 8もインストールしておきます。

* OS:CentOS 7
* Java 8

```
[shoshii@cassandra-1 cassandra]$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
```

# 手順


## 1. CentOSサーバーのセットアップ

以下はCentOSサーバーでの作業です。

### ant

antをインストールします。

RPMパッケージをダウンロード

```
$ curl -O http://mirror.centos.org/altarch/7/os/aarch64/Packages/ant-1.9.4-2.el7.noarch.rpm
``` 

インストール

```
$ rpm -ivh ant-1.9.4-2.el7.noarch.rpm
```

バージョン確認

```
$ ant -version
Apache Ant(TM) version 1.9.4 compiled on November 5 2018
```

### xwindow

今回はIntelliJをCentOS上で稼働させたいので、xwindowをインストールします。

1. `$ sudo yum groupinstall -y "X Window System"`
1. `$ sudo yum groupinstall -y "GNOME Desktop"`
1. `$ sudo reboot`

### VNC Server

今回は、MacからCentOS7にリモートデスクトップ接続をするため、VNC Serverをインストールします。

`$ sudo yum install -y tigervnc-server`

デスクトップを起動します。

`$ vncserver -geometry 1980x1080`

Macから、リモートデスクトップで接続できるか確認します。

* Finder -> 移動 -> サーバーへ接続 -> `vnc://<CentOSのhost>:5901`

注意：ポート番号は、起動しているリモートデスクトップサーバーの数に依ります。１つ目に起動したサーバーに接続する場合、ポート番号は5901になるようです。

![スクリーンショット 2021-07-13 8.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/57e0f063-e6a8-38ad-bb21-3211dee24461.png)
注意:接続ができない場合、`firewalld`が有効になっている可能性があります。`sudo systemctl status firewalld`などで状態確認後、セキュリティ上問題なければ停止・無効化します。

停止

```
$ sudo systemctl stop firewalld
```

無効化

```
$ sudo systemctl disable firewalld
```

### IntelliJ IDEA

IntelliJ IDEA Community 版をインストールします。
**MacではなくCentOSにインストールする点、ご注意ください**

1. CentOSサーバーのブラウザで、[JetBrain ToolBoxサイト](https://www.jetbrains.com/ja-jp/toolbox-app/)にアクセスし、ToolBoxの tar.gz(Linux)をダウンロード ![Screenshot from 2021-07-13 08-46-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/2e65b1a6-a8f9-7880-2a50-b27a9c54fea6.png)
1. 上記の圧縮ファイルを解凍し、中身を実行
1. IntelliJ IDEA Community Edition を installする。インストール後の状態:![Screenshot from 2021-07-13 09-00-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/3a7ce4b2-ad0f-b9ed-b310-c59c26a9667f.png)



## 2. ソースコードのビルドと実行

CentOSサーバーでの作業です。
CentOSのセットアップが済んだら、Cassandraのソースをダウンロードしビルドします。
[Community doc development](https://cassandra.apache.org/doc/latest/development/ide.html#building-from-source)を参考にして実施していきます。

公式のリポジトリからクローンしてきます。

```
$ git clone https://gitbox.apache.org/repos/asf/cassandra.git cassandra
```

ブランチを確認してみます。

```
[shoshii@cassandra-1 cassandra]$ cd cassandra
[shoshii@cassandra-1 cassandra]$ git branch -a
* trunk
  remotes/origin/HEAD -> origin/trunk
  remotes/origin/cassandra-1.0
  remotes/origin/cassandra-1.1
  remotes/origin/cassandra-1.2
  remotes/origin/cassandra-2.0
  remotes/origin/cassandra-2.1
  remotes/origin/cassandra-2.2
  remotes/origin/cassandra-3.0
  remotes/origin/cassandra-3.11
  remotes/origin/cassandra-4.0
  remotes/origin/cassandra-4.0.0
  remotes/origin/trunk
```

今回は、バージョン4.0をターゲットにします。

```
[shoshii@cassandra-1 cassandra]$ git checkout cassandra-4.0
Branch cassandra-4.0 set up to track remote branch cassandra-4.0 from origin.
Switched to a new branch 'cassandra-4.0'
[shoshii@cassandra-1 cassandra]$ 
```

`ant`でビルドします。

```
[shoshii@cassandra-1 cassandra]$ ant
Buildfile: /home/shoshii/qiita/cassandra/build.xml

validate-build-conf:
...
略
...
      [jar] Building jar: /home/shoshii/qiita/cassandra/build/tools/lib/fqltool.jar

BUILD SUCCESSFUL
Total time: 20 seconds
[shoshii@cassandra-1 cassandra]$ 
```

`ant generate-idea-files`でIntelliJ 向けのファイルをビルドします。

```
[shoshii@cassandra-1 cassandra]$ ant generate-idea-files
Buildfile: /home/shoshii/qiita/cassandra/build.xml
...
略
...
BUILD SUCCESSFUL
Total time: 1 second
[shoshii@cassandra-1 cassandra]$ 
```

## 3. IntelliJでCassandraを実行・デバッグしてみる

MacからVNC接続でCentOSのデスクトップにアクセスします。

* CentOSで実行：`$ vncserver -geometry 1980x1080`
* Macで実行：Finder -> 移動 -> サーバーへ接続 -> `vnc://<CentOSのhost>:5901`

IntelliJを起動します。

* アプリケーション -> プログラミング -> IntelliJ IDEA Community Edition

cloneしたcassandraのディレクトリをプロジェクトとして開きます。

* ツールメニュー -> File -> Open -> git clone した cassandra ディレクトリ

![Screenshot from 2021-07-14 05-54-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/db5765a2-22c7-17d4-8ea7-098be217bf28.png)

### Cassandraの実行
Cassandraを実行します。

* ツールメニュー -> Run -> Run Cassandra

![Screenshot from 2021-07-14 06-02-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/a3d730c8-8ff5-82dd-7556-552591ff9ee9.png)

Cassandraに、クライアントツールで接続してみます。

1.CentOSサーバーにMacのターミナルやCentOSの端末でSSHログイン
2.Cassandraをcloneしたディレクトリに移動

```
[shoshii@cassandra-1 cassandra]$ pwd
/home/shoshii/qiita/cassandra
```

3.cqlsh起動

```
[shoshii@cassandra-1 cassandra]$ bin/cqlsh
Python 2.7 support is deprecated. Install Python 3.6+ or set CQLSH_NO_WARN_PY2 to suppress this message.

Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.0.0 | Cassandra 4.0.1-SNAPSHOT | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cqlsh> 
```

起動中のCassandraに接続が成功しました。
cqlshは、Cassandraに各種コマンドを実行するためのクライアントツールです。データのselectやinsertもこのツールで行うことができます。

4.cqlshコマンド実行
試しに、`desc keyspaces`コマンドでキースペース一覧を表示してみます。

```
cqlsh> desc keyspaces;

system       system_distributed  system_traces  system_virtual_schema
system_auth  system_schema       system_views   test                 

cqlsh> 
```

### Cassandraのデバッグ
次に、Cassandraをデバッグ実行します。

まず、先程起動したCassandraプロセスを停止します。
* ツールメニュー -> Run -> Stop Cassandra をクリックします

* `src/java/org/apache/cassandra/service/CassandraDaemon.java` を開きます。このファイルには、Cassandraデーモンプロセスを起動する時の処理が書かれています。
![Screenshot from 2021-07-14 06-19-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/5a919698-348c-6383-8024-a76b9df1c8f3.png)
* `setup`メソッドの先頭にブレークポイントを入れてみます。
* ツールメニュー -> Run -> Debug Cassandra をクリックします
![Screenshot from 2021-07-14 06-25-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72807/796a17a8-ef47-d0fb-5057-27a7ee5f7aef.png)
ステップ実行を開始できました。

## 4. コミュニティに登録する

Apache Cassandraのコミュニティに登録し、各種情報を受け取れるようにします。Cassandraを利用する上での質問をしたり、開発の議論に参加することもできます。

[Community](https://cassandra.apache.org/community/) ページにアクセスし、MLに参加します

Slackチャネルもあるようですが、apache.orgドメインのメールアドレスがないと参加できない？ようです（調査中）

### ML

* User ML user-subscribe@cassandra.apache.org へメール送信 -> 送信されてくるメールの案内に従い登録
* Dev ML dev-subscribe@cassandra.apache.org へメール送信 -> 送信されてくるメールの案内に従い登録

# 参考

参考にさせていただいたページです。

* [CentOS7にJava8のビルドサーバ（Ant）構築手順](https://qiita.com/nyao/items/dec0769a1b03acae1522)
* [CentOS 7で後からX windowsを追加インストールする方法](https://www.steponboard.net/centos-7/928/)
* [MacからLinuxのデスクトップ環境へVNC接続する](https://qiita.com/toshiro3/items/808537690bdfe04a391c)
* [cassandra.apache.org](https://cassandra.apache.org/doc/latest/development/ide.html#building-from-source)

以上です。