さて、前回の記事の続きです。
Stormおよびstorm-mqttのビルドまではできたので、ここからexamplesを起動させようと思います。
MQTT BrokerとPublisherを起動する
こちらに書いてありますが、まずは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ファイルを生成する。
こちらにビルド方法が書いてありました。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ファイルをデプロイする際に必要になるもので、スキップしても大丈夫らしい。(参照元はこちら)
※外人さんはようこういうのやるわ。
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は動かせましたが、実際に便利かどうかは、これを用いてサンプルの実装をしてみないと実感できないですね。その辺は別の回として投稿できれば、と思います。