Raspberry Pi 2でApache Stormのサンプルを実行する

storm-ui-2

前回までで2台の Raspberry Pi 2を使ってApache Stormを実行する環境まで作りました。次はサンプルプログラムを実際に動かしながら、Stormについて理解していきたいと思います。

Apache Stormのチュートリアルを見てみると、”storm-starter“というプロジェクトを例として使っていくようなので、これをまず使えるようにします。

ここでは、プロジェクト自体はRaspberry Pi 2上ではなく、メインに使っている開発用PC(自分の場合はMac)上で、Eclipseを使って開発するようにしていきます。Eclipse自体は開発用PCにすでにインストールされている前提です。ここからは、以下を参考にさせてもらいながら進めていきます。

まず、自分の開発用PCにもApache Stormの最新版をダウンロードしてきて、解凍して、パスを通します。

$ tar xzvf apache-storm-0.9.4.tar.gz
$ sudo cp -R apache-storm-0.9.4 /usr/local/.
$ sudo ln -s /usr/local/apache-storm-0.9.4 /usr/local/storm
$ vim ~/.bash_profile
export STORM_HOME=/usr/local/storm
export PATH=$PATH:$STORM_HOME/bin
$ source ~/.bash_profile

ここまでできたら、Eclipseを起動します。新規のJavaプロジェクトを作成、ここではプロジェクト名を”Storm-Starter”にします。

プロパティの”Javaのビルド・バス” -> “ライブラリ” -> “外部Jar追加”で、”/usr/local/storm/lib”以下のすべての”*.jar”と、”/usr/local/storm/examples/storm-starter/storm-starter-topologies-0.9.4.jar”を追加します。

storm-eclipse-1

ここまでできたら一旦Eclipseから離れて、gitの”storm-starter“のレポジトリをクローンしてきます。

$ git clone git://github.com/apache/storm.git

これで、stormディレクトリができる(*さっき/usr/localに持っていったものとごっちゃにならないように注意)ので、中のサンプルソースをEclipseに持っていきます。Eclipseのパッケージ・エクスプローラのStorm-Starterのsrc上で右クリック、”インポート”->”一般”->”ファイルシステム”で、”storm/examples/storm-starter/src/jvm/storm”を参照、”トップレベルのフォルダーを作成”にチェックを入れて”完了”します。

storm-eclipse-2

それから、projectのトップに、同様にして”storm/examples/storm-starter/multilang/resources”をインポートします。

ここまでやってみたところ、いくつかのファイルのエラーが消えません。どうやら、”storm-core-0.9.4.jar”に、必要なクラスファイルが含まれていない様子。ということで、さっきgitからクローンしてきたものを、自分のローカルマシン上でビルドしてjarファイルを作ります。

まず、Mavenというものをインストールします。インストール方法はこちらを参照のこと。基本的には、ダウンロードして、パスを通すだけ。環境変数JAVA_HOMEが正しく設定されていれば、

$ mvn --version

でJavaとMavenのバージョンが正しく表示されるはずです。ちなみに自分はJAVA_HOMEが設定されていなかったので、この機会にJava 8 SDKを突っ込んで、~/.bash_profileに以下を追記しました。

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home

Mavenがインストールされていることを確認できたら、先ほどgitでクローンしてきたディレクトリのトップ(storm)で、以下を実行します。

$ mvn clean install -DskipTests=true

これで、Stormがビルドされて、”storm/storm-core/target/storm-core-0.11.0-SNAPSHOT.jar”が生成されるので、このjarファイルを、先ほどの”storm-core-0.9.4.jar”の代わりにEclipseのプロジェクトに参照させます。これで、ソースのエラーは消えました。

あとは、このプロジェクトをJARファイルに固めます。”エクスポート” ->”Java”->”JAR File”で、.classpathと.projectを除いてJARにします。名前は”StormStarter.jar”とかで。

 

こうしてできたJARファイルを、JARファイルを作成した開発用PCからStormクラスタに投げて実行させます。そのために、開発用PCの方にもstorm.yamlを作成して、StormクラスタのNimbusがどこにいるかを教えてやる必要があります。

$ mkdir ~/.storm
$ vim ~/.storm/storm.yaml
nimbus.host: "192.168.24.51"

自分の場合は、上のアドレスが、Nimbus&Zookeeper用に設定したRaspberry Piのアドレスになっています。ここまでできたら、開発用PCで、先ほど作成したjarファイルを実行します。

$ storm jar StormStarter.jar storm.starter.ExclamationTopology test
Running: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -client -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-0.9.4 -Dstorm.log.dir=/usr/local/apache-storm-0.9.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-0.9.4/lib/asm-4.0.jar:/usr/local/apache-storm-0.9.4/lib/carbonite-1.4.0.jar:/usr/local/apache-storm-0.9.4/lib/chill-java-0.3.5.jar:/usr/local/apache-storm-0.9.4/lib/clj-stacktrace-0.2.2.jar:/usr/local/apache-storm-0.9.4/lib/clj-time-0.4.1.jar:/usr/local/apache-storm-0.9.4/lib/clojure-1.5.1.jar:/usr/local/apache-storm-0.9.4/lib/clout-1.0.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-codec-1.6.jar:/usr/local/apache-storm-0.9.4/lib/commons-exec-1.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-fileupload-1.2.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-io-2.4.jar:/usr/local/apache-storm-0.9.4/lib/commons-lang-2.5.jar:/usr/local/apache-storm-0.9.4/lib/commons-logging-1.1.3.jar:/usr/local/apache-storm-0.9.4/lib/compojure-1.1.3.jar:/usr/local/apache-storm-0.9.4/lib/core.incubator-0.1.0.jar:/usr/local/apache-storm-0.9.4/lib/disruptor-2.10.1.jar:/usr/local/apache-storm-0.9.4/lib/hiccup-0.3.6.jar:/usr/local/apache-storm-0.9.4/lib/jetty-6.1.26.jar:/usr/local/apache-storm-0.9.4/lib/jetty-util-6.1.26.jar:/usr/local/apache-storm-0.9.4/lib/jgrapht-core-0.9.0.jar:/usr/local/apache-storm-0.9.4/lib/jline-2.11.jar:/usr/local/apache-storm-0.9.4/lib/joda-time-2.0.jar:/usr/local/apache-storm-0.9.4/lib/json-simple-1.1.jar:/usr/local/apache-storm-0.9.4/lib/kryo-2.21.jar:/usr/local/apache-storm-0.9.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/apache-storm-0.9.4/lib/logback-classic-1.0.13.jar:/usr/local/apache-storm-0.9.4/lib/logback-core-1.0.13.jar:/usr/local/apache-storm-0.9.4/lib/math.numeric-tower-0.0.1.jar:/usr/local/apache-storm-0.9.4/lib/minlog-1.2.jar:/usr/local/apache-storm-0.9.4/lib/objenesis-1.2.jar:/usr/local/apache-storm-0.9.4/lib/reflectasm-1.07-shaded.jar:/usr/local/apache-storm-0.9.4/lib/ring-core-1.1.5.jar:/usr/local/apache-storm-0.9.4/lib/ring-devel-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/ring-jetty-adapter-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/ring-servlet-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/servlet-api-2.5.jar:/usr/local/apache-storm-0.9.4/lib/slf4j-api-1.7.5.jar:/usr/local/apache-storm-0.9.4/lib/snakeyaml-1.11.jar:/usr/local/apache-storm-0.9.4/lib/storm-core-0.9.4.jar:/usr/local/apache-storm-0.9.4/lib/tools.cli-0.2.4.jar:/usr/local/apache-storm-0.9.4/lib/tools.logging-0.2.3.jar:/usr/local/apache-storm-0.9.4/lib/tools.macro-0.1.0.jar:StormStarter.jar:/Users/nick/.storm:/usr/local/apache-storm-0.9.4/bin -Dstorm.jar=StormStarter.jar storm.starter.ExclamationTopology test
478  [main] INFO  backtype.storm.StormSubmitter - Jar not uploaded to master yet. Submitting jar...
542  [main] INFO  backtype.storm.StormSubmitter - Uploading topology jar StormStarter.jar to assigned location: /tmp/storm/nimbus/inbox/stormjar-229759d3-5b10-425e-ab09-ae98b422529d.jar
Start uploading file 'StormStarter.jar' to '/tmp/storm/nimbus/inbox/stormjar-229759d3-5b10-425e-ab09-ae98b422529d.jar' (90365 bytes)
[==================================================] 90365 / 90365
File 'StormStarter.jar' uploaded to '/tmp/storm/nimbus/inbox/stormjar-229759d3-5b10-425e-ab09-ae98b422529d.jar' (90365 bytes)
678  [main] INFO  backtype.storm.StormSubmitter - Successfully uploaded topology jar to assigned location: /tmp/storm/nimbus/inbox/stormjar-229759d3-5b10-425e-ab09-ae98b422529d.jar
679  [main] INFO  backtype.storm.StormSubmitter - Submitting topology test in distributed mode with conf {"topology.workers":3,"topology.debug":true}
2915 [main] INFO  backtype.storm.StormSubmitter - Finished submitting topology: test

submitが成功すると、Nimbus&Zookeeper用のRaspberry Piで動いているStorm UIのWebページ(”http://(Nimbus&Zookeeper用のRaspberry PiのIPアドレス):8080″)で、以下のように”Topology summary”に”test”が表示されるようになります。”test”をクリックすると、さらに詳細な情報が得られます。

storm-ui-2

storm-ui-3

Topologyを終了させるには、開発用PCの方で以下のコマンドを実行します。

$ storm kill test
Running: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -client -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-0.9.4 -Dstorm.log.dir=/usr/local/apache-storm-0.9.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-0.9.4/lib/asm-4.0.jar:/usr/local/apache-storm-0.9.4/lib/carbonite-1.4.0.jar:/usr/local/apache-storm-0.9.4/lib/chill-java-0.3.5.jar:/usr/local/apache-storm-0.9.4/lib/clj-stacktrace-0.2.2.jar:/usr/local/apache-storm-0.9.4/lib/clj-time-0.4.1.jar:/usr/local/apache-storm-0.9.4/lib/clojure-1.5.1.jar:/usr/local/apache-storm-0.9.4/lib/clout-1.0.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-codec-1.6.jar:/usr/local/apache-storm-0.9.4/lib/commons-exec-1.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-fileupload-1.2.1.jar:/usr/local/apache-storm-0.9.4/lib/commons-io-2.4.jar:/usr/local/apache-storm-0.9.4/lib/commons-lang-2.5.jar:/usr/local/apache-storm-0.9.4/lib/commons-logging-1.1.3.jar:/usr/local/apache-storm-0.9.4/lib/compojure-1.1.3.jar:/usr/local/apache-storm-0.9.4/lib/core.incubator-0.1.0.jar:/usr/local/apache-storm-0.9.4/lib/disruptor-2.10.1.jar:/usr/local/apache-storm-0.9.4/lib/hiccup-0.3.6.jar:/usr/local/apache-storm-0.9.4/lib/jetty-6.1.26.jar:/usr/local/apache-storm-0.9.4/lib/jetty-util-6.1.26.jar:/usr/local/apache-storm-0.9.4/lib/jgrapht-core-0.9.0.jar:/usr/local/apache-storm-0.9.4/lib/jline-2.11.jar:/usr/local/apache-storm-0.9.4/lib/joda-time-2.0.jar:/usr/local/apache-storm-0.9.4/lib/json-simple-1.1.jar:/usr/local/apache-storm-0.9.4/lib/kryo-2.21.jar:/usr/local/apache-storm-0.9.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/apache-storm-0.9.4/lib/logback-classic-1.0.13.jar:/usr/local/apache-storm-0.9.4/lib/logback-core-1.0.13.jar:/usr/local/apache-storm-0.9.4/lib/math.numeric-tower-0.0.1.jar:/usr/local/apache-storm-0.9.4/lib/minlog-1.2.jar:/usr/local/apache-storm-0.9.4/lib/objenesis-1.2.jar:/usr/local/apache-storm-0.9.4/lib/reflectasm-1.07-shaded.jar:/usr/local/apache-storm-0.9.4/lib/ring-core-1.1.5.jar:/usr/local/apache-storm-0.9.4/lib/ring-devel-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/ring-jetty-adapter-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/ring-servlet-0.3.11.jar:/usr/local/apache-storm-0.9.4/lib/servlet-api-2.5.jar:/usr/local/apache-storm-0.9.4/lib/slf4j-api-1.7.5.jar:/usr/local/apache-storm-0.9.4/lib/snakeyaml-1.11.jar:/usr/local/apache-storm-0.9.4/lib/storm-core-0.9.4.jar:/usr/local/apache-storm-0.9.4/lib/tools.cli-0.2.4.jar:/usr/local/apache-storm-0.9.4/lib/tools.logging-0.2.3.jar:/usr/local/apache-storm-0.9.4/lib/tools.macro-0.1.0.jar:/Users/nick/.storm:/usr/local/apache-storm-0.9.4/bin backtype.storm.command.kill_topology test
807  [main] INFO  backtype.storm.thrift - Connecting to Nimbus at 192.168.24.51:6627
978  [main] INFO  backtype.storm.command.kill-topology - Killed topology: test

 

ここまでEclipseを併用しながらサンプル”spark-starter”を実行してきましたが、実は単に”spark-starter”を実行させるだけなら、Eclipseを使う必要はありません。上記の手順の途中で、gitから落としてきたクローンレポジトリをビルドしていましたが、そのときに”storm/examples/storm-starter/target/storm-starter-0.11.0-SNAPSHOT.jar”ができているので、これを上記で作成したJARファイルの代わりに使ってやればOKです。まー、今後自分でStormのプロジェクトを作成することもあるかもしれないので、そのときのためのメモ書きということで。

さらに言えば、今回は.tar.gzで固められたStormと、gitのStormを混在させてしまいましたが、中身はほぼ同じだったので、gitのStormだけ落としてきてやった方がシンプルだったかもしれません。次に環境構築することがあれば、そっちでやってみようと思います。

しかし、サンプル動かすのに精一杯で、肝心の中身を理解するに至りませんでした。次はなんとかそこまで踏み込んでいきたいところです。