storm-mqttを起動させる　その2

さて、[前回](http://qiita.com/kojiisd/items/eefebad1794710debd2b)の記事の続きです。

Stormおよびstorm-mqttのビルドまではできたので、ここからexamplesを起動させようと思います。

# MQTT BrokerとPublisherを起動する
[こちら](https://github.com/apache/storm/tree/master/external/storm-mqtt)に書いてありますが、まずはMQTT BrokerとPublisherを起動しましょう。実行時のディレクトリはstorm-mqttになります。

```
java -cp examples/target/storm-mqtt-examples-*-SNAPSHOT.jar org.apache.storm.mqtt.examples.MqttBrokerPublisher
```

うまく起動しました。

```
16:12:30.535 [main] INFO  org.apache.storm.mqtt.examples.MqttBrokerPublisher - Starting broker...
16:12:30.923 [main] INFO  org.apache.storm.mqtt.examples.MqttBrokerPublisher - MQTT broker started
16:12:30.954 [hawtdispatch-DEFAULT-1] DEBUG org.apache.storm.mqtt.MqttLogger - Connecting
16:12:31.003 [hawtdispatch-DEFAULT-1] DEBUG org.apache.storm.mqtt.MqttLogger - Transport connected
16:12:31.007 [hawtdispatch-DEFAULT-1] DEBUG org.apache.storm.mqtt.MqttLogger - Logging in
16:12:31.029 [hawtdispatch-DEFAULT-2] DEBUG org.apache.storm.mqtt.MqttLogger - MQTT login accepted
16:12:31.033 [main] INFO  org.apache.storm.mqtt.examples.MqttBrokerPublisher - Publishing to topic /users/tgoetz/office/1234
16:12:31.034 [main] INFO  org.apache.storm.mqtt.examples.MqttBrokerPublisher - Cntrl+C to exit.

```

# サンプルのTopologyを起動する
次に、サンプルとして提供されているTopologyを起動します。

```
storm jar ./examples/target/storm-mqtt-examples-*-SNAPSHOT.jar org.apache.storm.flux.Flux ./examples/src/main/flux/sample.yaml --local
```

地味にstormにパスが通っていることが前提ですが、ひとまずstormのリポジトリにbin/stormがあったので、それを動かすようにstormを起動

```
<stormをcloneしたディレクトリ>/bin/storm jar ./examples/target/storm-mqtt-examples-*-SNAPSHOT.jar org.apache.storm.flux.Flux ./examples/src/main/flux/sample.yaml --local
```

エラーが出ました。

```
The storm client can only be run from within a release. You appear to be trying to run the client from a checkout of Storm's source code.

You can download a Storm release at http://storm-project.net/downloads.html
```

bin配下のstormは、使うな、ということでしょうか。リリースされている媒体のstormを使え、、、と。同ディレクトリにstorm.pyがあり覗きましたが、どうもこれを回避するのは難しそうです。ですので大人しく上記リンクから最新版の0.10.0をDLしてStormを起動しましょう。（ここに落とし穴がある）

DLしたstorm起動スクリプトを使うようにしてコマンドを打つと、こんなメッセージが。

```
███████╗██╗     ██╗   ██╗██╗  ██╗
██╔════╝██║     ██║   ██║╚██╗██╔╝
█████╗  ██║     ██║   ██║ ╚███╔╝
██╔══╝  ██║     ██║   ██║ ██╔██╗
██║     ███████╗╚██████╔╝██╔╝ ██╗
╚═╝     ╚══════╝ ╚═════╝ ╚═╝  ╚═╝
+-         Apache Storm        -+
+-  data FLow User eXperience  -+
Version: 2.0.0-SNAPSHOT
Parsing file: /Users/KojiIshida/Documents/workspace/personal_git/apache/storm/external/storm-mqtt/./examples/src/main/flux/sample.yaml
462  [main] INFO  o.a.s.f.p.FluxParser - loading YAML from input stream...
464  [main] INFO  o.a.s.f.p.FluxParser - Not performing property substitution.
464  [main] INFO  o.a.s.f.p.FluxParser - Not performing environment variable substitution.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/Config
	at org.apache.storm.flux.FluxBuilder.buildConfig(FluxBuilder.java:45)
	at org.apache.storm.flux.Flux.runCli(Flux.java:151)
	at org.apache.storm.flux.Flux.main(Flux.java:98)
Caused by: java.lang.ClassNotFoundException: org.apache.storm.Config
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 3 more
```

現バージョンの0.10.0のstormでは、Configクラスが存在する場所が異なるようです。調べてみると、

- 0.10.0系：backtype/storm/Config.class
- 2.0.0系：org/apache/storm/Config.class

こりゃ確かに動かないですな。ということでcloneしているstormのソースから媒体を作成する方法が必要です。

# Stormをビルドしてjarファイルを生成する。
[こちら](https://github.com/apache/storm/blob/master/DEVELOPER.md#packaging)にビルド方法が書いてありました。storm-dist内でビルドしろ、と。

で、storm-dist配下で 

```
mvn package
```

しましたが、

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 39.244 s
[INFO] Finished at: 2016-03-06T17:25:24+09:00
[INFO] Final Memory: 19M/439M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-gpg-plugin:1.6:sign (default) on project apache-storm-bin: Unable to execute gpg command: Error while executing process. Cannot run program "gpg": error=2, No such file or directory -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
```

エラー発生。ただ、このgpgはjarファイルをデプロイする際に必要になるもので、スキップしても大丈夫らしい。（参照元は[こちら](https://github.com/andreptb/fitnesse-selenium-slim/issues/10)）
※外人さんはようこういうのやるわ。

```
mvn package -Dgpg.skip
```

これでビルドが成功するので、ようやく生成されたstorm-coreのtar.gzファイルを適当なフォルダへ。そして起動。

```
<保存ディレクトリ>/apache-storm-2.0.0-SNAPSHOT/bin/storm jar ./examples/target/storm-mqtt-examples-2.0.0-SNAPSHOT.jar org.apache.storm.flux.Flux ./examples/src/main/flux/sample.yaml --local
```

動きましたね。。。長かった。

```
10776 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=72.0, humidity=69.0}
11283 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=57.0, humidity=8.0}
11789 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=49.0, humidity=40.0}
12295 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=50.0, humidity=31.0}
12798 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=40.0, humidity=40.0}
13305 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=16.0, humidity=18.0}
13808 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=31.0, humidity=93.0}
14312 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=76.0, humidity=39.0}
14820 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=29.0, humidity=19.0}
15323 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=74.0, humidity=82.0}
15830 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=55.0, humidity=6.0}
16332 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=92.0, humidity=82.0}
16839 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=16.0, humidity=86.0}
17341 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=59.0, humidity=46.0}
17848 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=69.0, humidity=8.0}
18353 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=66.0, humidity=80.0}
18859 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=64.0, humidity=44.0}
19365 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=38.0, humidity=48.0}
19870 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=3.0, humidity=91.0}
20374 [Thread-32-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {user=tgoetz, deviceId=1234, location=office, temperature=79.0, humidity=48.0}
```


さて、これでexampleは動かせましたが、実際に便利かどうかは、これを用いてサンプルの実装をしてみないと実感できないですね。その辺は別の回として投稿できれば、と思います。