Apache Stormの導入-サンプルプログラムの実行

※詳しくは、この[Webページを参照](http://acro-engineer.hatenablog.com/entry/20111123/1322059295)

動作確認：CentOS 6.6(final)

## 0 ZooKeeprをローカルモードで動かす。

[ZooKeeper.md](http://qiita.com/soushiy/items/f4d2d91d7ac79669e0dd)の第1章のみを実行して、ZooKeeperをローカルモードで実行する。

## 1 ZeroMQをインストール
ZeroMQというのはネットワークライブラリの一つで、
マルチキャストやユニキャストといった『多数への通信』が
扱いやすいという特徴を持ちます。

Stormは多数のマシンで構成されるのが前提なため、適しているのでしょう。
バージョンが指定されているのは動作確認を行ったバージョンのようです。
### 1.1 ダウンロードおよび解凍

~~~sh
cd /usr/local/download/
curl -O http://download.zeromq.org/zeromq-4.0.5.tar.gz
tar -xzf zeromq-4.0.5.tar.gz 
cd zeromq-4.0.5
./configure
make
make install
~~~

## 2 JZMQをインストール
JZMQはJava用のZeroMQ言語バインディング（ZeroMQをJavaから呼び出せるようにする機構）です。
StormはJava、ClojureといったJVM言語で記述されているため、必要となります。

※JZMQはgitリポジトリから取得するため、gitコマンドをインストール

~~~sh
yum -y install git
~~~

### 2.1 ダウンロードおよび解凍
~~~sh
cd /usr/local/download
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
#>configure: error: the JAVA_HOME environment variable must be set to your JDK location.
~~~

※JDKがインストールされていないので、JDKをインストールします。JDK1.6が良い模様。

~~~sh
yum -y install java-1.6.0-openjdk-devel
~~~

上記のインストールによって、Open JDKが
「/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64」配下にインストールされます。
そのため、/etc/profile の末尾に下記の記述を追加します。

~~~sh
echo "export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk.x86_64" >> /etc/profile;
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk.x86_64
cd /usr/local/download/jzmq
./autogen.sh
./configure
make
make install
~~~

## 3 Pythonのバージョン確認(2.6.6)
※バージョンが違う場合は、こちらを[参照](http://acro-engineer.hatenablog.com/entry/20111212/1323645029)

~~~sh
python -V
#>Python 2.6.6
~~~

## 4 unzipのインストール

~~~sh
yum -y install unzip
~~~

## 5 Storm本体のインストール
[Storm GitHub](https://github.com/nathanmarz/storm/downloads)からリリースファイルをダウンロード

~~~sh
cd /usr/local/download/
curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/storm/apache-storm-0.9.3/apache-storm-0.9.3.tar.gz
tar xvzf apache-storm-0.9.3.tar.gz
chmod +x apache-storm-0.9.3/bin/storm
mv apache-storm-0.9.3 ../
cd ..
ln -s apache-storm-0.9.3/ storm
echo "export PATH=\$PATH:/usr/local/storm/bin" >> /etc/profile;
export PATH=$PATH:/usr/local/storm/bin
~~~

## 6 Maven3をインストールする。
### 6.1 Maven3のダウンロードおよび解凍
こちらから[Maven3](http://archive.apache.org/dist/maven/binaries/)をダウンロードする。

~~~sh
cd /usr/local/download/
curl -O http://ftp.riken.jp/net/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz
tar xvzf apache-maven-3.2.5-bin.tar.gz
mv apache-maven-3.2.5 ../
cd ..
ln -s apache-maven-3.2.5/ maven3
echo "export PATH=\$PATH:/usr/local/maven3/bin" >> /etc/profile;
export PATH=$PATH:/usr/local/maven3/bin
~~~

## 7 Leiningenをインストールする。
こちらを[参照](http://inet-lab.naist.jp/storm-local-cluster-1/)しています。

コンパイルであったりjarの生成であったりといった処理を全てLeiningenに任せます．また、プロジェクト管理については、冒頭にさらっとgitと一緒にaptで入れたmavenに任せます．
Leiningenをインストールします．Leiningenは上で少し触れましたが、正体はただのスクリプトなのでcurlでgithubから取得します．/usr/localの下にleiningen-x.xというディレクトリを作り、そちらにスクリプトをダウンロードして、同じく/usr/localのしたにleiningenというシンボリックリンクを貼って利用しましょう．取得してきたら実行権限を付与するのも忘れずに．

~~~sh
mkdir /usr/local/leiningen-2.5.0
cd /usr/local/leiningen-2.5.0/
curl -O /usr/local/leiningen-2.5.0/lein https://raw.github.com/technomancy/leiningen/stable/bin/lein
chmod +x lein
cd /usr/local/
ln -s leiningen-2.5.0/ leiningen
echo "export PATH=\$PATH:/usr/local/leiningen" >> /etc/profile;
export PATH=$PATH:/usr/local/leiningen
~~~

---
## 8 サンプルコードを実行する。
### 8.1 サンプルコードをCloneする。(ここからはユーザーで実行)
本記事では、ログインしているユーザの$HOME直下にstorm-project/というディレクトリを作成し、ここにstorm-starterをcloneすることにします．

~~~sh
mkdir ~/storm-project
cd ~/storm-project/
git clone git://github.com/nathanmarz/storm-starter
~~~

### 8.2 依存ライブラリを取得し、プロジェクトをコンパイルする

~~~sh
cd ~/storm-project/storm-starter/
echo 'export LEIN_ROOT=yes' >> /etc/profile
export LEIN_ROOT=yes
lein deps
lein compile
~~~

### 8.3 サンプルプログラムの実行(word-count)
これで依存ライブラリの解決も、コンパイルも終了です．早速実行して、Stormが正常に動作していることを確かめてみましょう．サンプルプログラムの実行にも、当然Leiningenを使います．それでは、storm-starterに収録されているword-countトポロジを実行します．このトポロジは、名前の通り、ストリームデータとして入力された文字列を単語毎にカウントし、その単語がシステム実行中に何度出現したかをカウントするためのコードとなっています．単に実行するだけではログが全て標準出力に表示されて追いかけにくいので、後で読み直せるように予めプロジェクトのトップにlogというディレクトリを作っておいて、一時的なログを溜めておきましょう．
#### 8.3.1 ログ出力のためのディレクトリを作成する。

~~~sh
cd ~/storm-project/storm-starter/
mkdir log
~~~

#### 8.3.2 サンプルプログラムを実行する

~~~sh
cd ~/storm-project/storm-starter/
java -cp $(lein classpath) storm.starter.WordCountTopology > log/word-count_log
grep "Emitting: count default" log/word-count_log
#>14233 [Thread-16-count] INFO  backtype.storm.daemon.task - Emitting: count default [am, 61]
#>...(中略)...
#>14233 [Thread-16-count] INFO  backtype.storm.daemon.task - Emitting: count default [jumped, 45]
#>14233 [Thread-18-count] INFO  backtype.storm.daemon.task - Emitting: count default [the, 188]
#>14234 [Thread-18-count] INFO  backtype.storm.daemon.task - Emitting: count default [with, 61]
#>14234 [Thread-18-count] INFO  backtype.storm.daemon.task - Emitting: count default [moon, 45]
#>14234 [Thread-18-count] INFO  backtype.storm.daemon.task - Emitting: count default [nature, 61]
~~~

上手く動かない場合は、ZooKeeperが動いているかを確認する。

~~~sh
echo ruok | nc localhost 2181
#>imok

#imokが帰ってこない(動いていない)場合は、下記コマンドを実行してZooKeeperを起動する。
zkServer.sh start
~~~

# References
※こちらを[参照](http://inet-lab.naist.jp/storm-local-cluster-1/)した。

※こちらを[参照](http://storm.apache.org/documentation/Setting-up-development-environment.html)した。