Apache Stormを動かす(複数台で動かす、Distributed Mode編)


※こちらを[参照](http://tjun.org/blog/2012/04/storm-cluster-setup2-one/)した。

## 9 [Apache Stormを動かす](http://qiita.com/soushiy/items/bf3b3688113bb9baa0e3)に従って、単体動作まで完了させる。

## 10 ZooKeeprをDistributed Modeで動かす。

- [ZooKeeper.md](http://qiita.com/soushiy/items/f4d2d91d7ac79669e0dd)の第2章のみを実行して、ZooKeeperをDistributed Modeで実行する。

## 11 Stormクラスタの設定を行う。(root権限で実行)
- stormの設定は、storm.yaml というファイルを作りますが、 stormのサーバの設定用のstorm.yaml と、クライアントの設定用のstorm.yamlがあるので注意が必要です。 サーバ用とは、stormを動かすための設定で、nimbusとsupervisorで通信したり、zookeeperとやりとりをするための設定です。 クライアント用とは、stormにtopologyを投入する時に、workerはいくつにする、などの設定です。

---
サーバーとなるvm1上で実行すること。
---

### 11.1 サーバー用設定を編集する。

- まず、server設定用を編集します。 server用の設定は、Stormをインストールしたディレクトリを$STORMHOMEとしたとき、$STORMHOME/conf にあります。

- ※今回はvm1.soushi.jp〜vm5.soushi.jpまで5台あるとする。
- ※ワーカーが使うポート番号は6700〜6703の4ワーカー分。

#### storm.zookeeper.servers

~~~sh
su
cp /usr/local/storm/conf/storm.yaml /usr/local/storm/conf/storm.yaml.bak
echo "# This is a list of the hosts in the Zookeeper cluster for your Storm cluster." >> /usr/local/storm/conf/storm.yaml
echo "storm.zookeeper.servers:" >> /usr/local/storm/conf/storm.yaml
echo "- '192.168.66.201'" >> /usr/local/storm/conf/storm.yaml
echo "- '192.168.66.202'" >> /usr/local/storm/conf/storm.yaml
echo "- '192.168.66.203'" >> /usr/local/storm/conf/storm.yaml
echo "- '192.168.66.204'" >> /usr/local/storm/conf/storm.yaml
echo "- '192.168.66.205'" >> /usr/local/storm/conf/storm.yaml
~~~


#### storm.local.dir

~~~sh
echo "" >> /usr/local/storm/conf/storm.yaml
echo "# The Nimbus and Supervisor daemons require a directory on the local disk" >> /usr/local/storm/conf/storm.yaml
echo "# to store small amounts of state (like jars, confs, and things like that)." >> /usr/local/storm/conf/storm.yaml
echo "# You should create that directory on each machine, give it proper permissions, " >> /usr/local/storm/conf/storm.yaml
echo "# and then fill in the directory location using this config." >> /usr/local/storm/conf/storm.yaml
echo "storm.local.dir: '/tmp/storm'" >> /usr/local/storm/conf/storm.yaml
~~~

#### nimbus.host

~~~sh
echo "" >> /usr/local/storm/conf/storm.yaml
echo "# The worker nodes need to know which machine is the master in order to download " >> /usr/local/storm/conf/storm.yaml
echo "# topology jars and confs." >> /usr/local/storm/conf/storm.yaml
echo "nimbus.host: '192.168.66.201'" >> /usr/local/storm/conf/storm.yaml
~~~

#### supervisor.slots.ports:

~~~sh
echo "" >> /usr/local/storm/conf/storm.yaml
echo "# For each worker machine, you configure how many workers run on that machine" >> /usr/local/storm/conf/storm.yaml
echo "# with this config. Each worker uses a single port for receiving messages, " >> /usr/local/storm/conf/storm.yaml
echo "# and this setting defines which ports are open for use. If you define five ports here," >> /usr/local/storm/conf/storm.yaml
echo "# then Storm will allocate up to five workers to run on this machine. If you define" >> /usr/local/storm/conf/storm.yaml
echo "# three ports, Storm will only run up to three. By default, this setting is configured" >> /usr/local/storm/conf/storm.yaml
echo "# to run 4 workers on the ports 6700, 6701, 6702, and 6703. " >> /usr/local/storm/conf/storm.yaml
echo "supervisor.slots.ports:" >> /usr/local/storm/conf/storm.yaml
echo "- 6700" >> /usr/local/storm/conf/storm.yaml
echo "- 6701" >> /usr/local/storm/conf/storm.yaml
echo "- 6702" >> /usr/local/storm/conf/storm.yaml
echo "- 6703" >> /usr/local/storm/conf/storm.yaml
echo "- 6704" >> /usr/local/storm/conf/storm.yaml
echo "- 6705" >> /usr/local/storm/conf/storm.yaml
echo "- 6706" >> /usr/local/storm/conf/storm.yaml
echo "- 6707" >> /usr/local/storm/conf/storm.yaml
echo "- 6708" >> /usr/local/storm/conf/storm.yaml
echo "- 6709" >> /usr/local/storm/conf/storm.yaml
~~~

- ※他にも設定できるパラメータはいくつかあります。デフォルトでは[defaults.yaml](https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml)の値が使われます。

### 11.2 storm.local.dirを作成する。

- 第11.1章で設定したstorm.local.dirを、実際に作成します。

~~~sh
mkdir /tmp/storm
~~~

---
クライアントとなるvm2〜vm5上で実行すること。
---

### 11.3 Stormのクライアントの設定

- stormのクライアント、stormクラスタに対してtopologyをsubmitする役割を持ちます。 そのため、その設定にはnimbusのIP addressが必要です。
- stormのクライアントの設定は、 ~/.storm/storm.yaml に記述します。

~~~sh
su
mkdir ~/.storm/
echo "nimbus.host: 'vm1.soushi.jp'" >> ~/.storm/storm.yaml
~~~

---
ローカル端末(Mac)で実行すること。
---

## 12 サンプルプログラムを実行する。
### 12.1 サンプルプログラムのダウンロード

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

### 12.2 ログ出力のためのディレクトリを作成する。

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

### 12.3 Mavenでサンプルコードをコンパイルする。

#### pom.xmlが無いというエラーがでるので、m2-pom.xmlをpom.xmlにリネームします。
~~~sh
cd ~/storm-project/storm-starter/
mv m2-pom.xml pom.xml
mvn compile exec:java -Dstorm.topology=storm.starter.WordCountTopology
mvn package
~~~

#### 謎のエラーが発生したら、Mavenのローカルフォルダを削除すると解決する可能性あり

~~~sh
rm -rf ~/.m2/
~~~

### 12.4 実行
#### 12.4.1 ZooKeeperを起動する。

~~~sh
zkServer.sh start &
~~~

#### 12.4.2 Stormを起動する。

~~~sh
storm logviewer &
storm ui &
storm nimbus &
storm supervisor &
~~~

- Stormの動作状況はlocalhost:8080で確認できる。
- ※今回は192.168.66.201上で動いているので、[http://192.168.66.201:8080/](http://192.168.66.201:8080/)にアクセスする。

#### 12.4.3 サンプルプログラムを実行する。
- ~/storm-project/storm-starter/target/フォルダ配下に、storm-starter-*.*.*-SNAPSHOT-jar-with-dependencies.jarが作成されているので、それを実行する。

- ※Exclamation Topologyを実行する場合

~~~sh
cd ~/storm-project/storm-starter/target/
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.ExclamationTopology test
~~~

- ※RollingTopWordsを実行する場合

~~~sh
cd ~/storm-project/storm-starter/target/
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.RollingTopWords
~~~