Raspberry Pi 2でApache Stormのサンプルを実行する
前回までで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”を追加します。
ここまでできたら一旦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”を参照、”トップレベルのフォルダーを作成”にチェックを入れて”完了”します。
それから、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”をクリックすると、さらに詳細な情報が得られます。
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だけ落としてきてやった方がシンプルだったかもしれません。次に環境構築することがあれば、そっちでやってみようと思います。
しかし、サンプル動かすのに精一杯で、肝心の中身を理解するに至りませんでした。次はなんとかそこまで踏み込んでいきたいところです。
ディスカッション
ピンバック & トラックバック一覧
[…] 前回までで、Raspberry Pi 2台の上でサンプルソース(”storm-starter”)を実行させるところまではできたので、今回は肝心のその中身について理解していきたいと思います。 […]