リアルタイム処理for Big DataのStormのサンプルを動かしてみる

Dempsyに続きまして,Stormです.
リアルタイム処理 for Big DataのDempsyのサンプルを動かしてみる - なぜか数学者にはワイン好きが多い

まず,StormはZeroMQが必要なのでインストールします.

> wget http://download.zeromq.org/zeromq-2.2.0.tar.gz
> tar xvf zeromq-2.2.0.tar.gz
> cd zeromq-2.2.0
> ./configure --with-pgm # PGMはオプションだが,zeromqパッケージにライブラリが付属している
> make
> make check
==================
All 9 tests passed
==================

> su
# make install

次に,ZeroMQのJavaバインディングをインストールします.node.jsバインディングもインストールに苦労しましたが(CとRubyは簡単だった気がします),ちょっと苦労しました.

> git clone https://github.com/nathanmarz/jzmq.git
Cloning into 'jzmq'...
error: Could not resolve host: github.com (Timeout while contacting DNS servers) while accessing https://github.com/nathanmarz/jzmq.git/info/refs
fatal: HTTP request failed

いきなりhttps:やhttp:じゃgitのcloneが作れなかったので,git:プロトコルに変更して逃げます.

> git clone git://github.com/nathanmarz/jzmq.git
Cloning into 'jzmq'...
remote: Counting objects: 611, done.
remote: Compressing objects: 100% (203/203), done.
remote: Total 611 (delta 319), reused 561 (delta 293)
Receiving objects: 100% (611/611), 303.58 KiB | 205 KiB/s, done.
Resolving deltas: 100% (319/319), done.

> cd jzmq/
> setenv JAVA_HOME /usr/local/openjdk6
> setenv JAVAC /usr/local/openjdk6/bin/javac
> setenv CPPFLAGS -I/usr/local/openjdk6/include/freebsd

> ./autogen.sh
> ./configure
configure: error: don't know how to find jni_md.h on this platform

FreeBSDは無視されているようなので,ちょっとだけconfigureに変更を加えます.

> emacs configure
    *freebsd*)
        CPPFLAGS="$CPPFLAGS -I${JAVA_HOME}/include/freebsd"
    ;;
> ./configure
> gmake
Making all in src
gmake[1]: Entering directory `/home/tetu-s/jzmq/src'
gmake[1]: *** No rule to make target `classdist_noinst.stamp', needed by `org/zeromq/ZMQ.class'.  Stop.
gmake[1]: Leaving directory `/home/tetu-s/jzmq/src'
gmake: *** [all-recursive] Error 1

...autoconfか何かのバグくさいので,ベタに作られたMakefileを見て対処をがんばります.

> cd src/

> touch classdist_noinst.stamp 
> gmake classnoinst.stamp
CLASSPATH=.:./.${CLASSPATH:+":$CLASSPATH"} /usr/local/openjdk6/bin/javac -d .    org/zeromq/ZMQ.java org/zeromq/ZMQException.java org/zeromq/ZMQQueue.java org/zeromq/ZMQForwarder.java org/zeromq/ZMQStreamer.java
echo timestamp > classnoinst.stamp
> cd ..
> gmake
> su
# gmake install

ZooKeeperやStormのスクリプトBashを求めるようなので,インストールします.

> cd /usr/ports/shells/bash
> make
> su
# make install

ローカルモードでもZooKeeperは必須なので,インストールします.

> wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz
> tar xvf zookeeper-3.4.3.tar.gz
> cd zookeeper-3.4.3
> cp conf/zoo_sample.cfg conf/zoo.cfg
 > ./bin/zkServer.sh start
JMX enabled by default
Using config: /home/tetu-s/zookeeper-3.4.3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

いよいよStorm本体をインストールします.解凍してコピーするだけですが.

> wget --no-check-certificate https://github.com/downloads/nathanmarz/storm/storm-0.8.0.zip
> unzip storm-0.8.0.zip
> su
# mv storm-0.8.0 /usr/local/
# ln -s /usr/local/storm-0.8.0 /usr/local/storm
# emacs /usr/local/storm/bin/storm # FreeBSDはPythonの場所が違ったので直す
---
#!/usr/bin/python
---->
#!/usr/local/bin/python
---
# exit

この時点で,Stormのデーモンを立ち上げることができます.

> /usr/local/storm/bin/storm nimbus
> /usr/local/storm/bin/storm supervisor
> /usr/local/storm/bin/storm ui

UIデーモンを立ち上げると,すぐにブラウザ経由でコントロールパネルを見ることができます.

これ,いいですね...

WordCountのサンプルプログラムを取り寄せます.

> git clone git://github.com/nathanmarz/storm-starter.git
Cloning into 'storm-starter'...
remote: Counting objects: 404, done.
remote: Compressing objects: 100% (150/150), done.
remote: Total 404 (delta 188), reused 387 (delta 177)
Receiving objects: 100% (404/404), 57.38 KiB, done.
Resolving deltas: 100% (188/188), done.

mavenでとりあえず実行,ゴー!

> cd storm-starter/
> mvn -f m2-pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCountTopology | & less

こんなふうに,ワードカウントされています.

12140 [Thread-25] INFO backtype.storm.daemon.task - Emitting: split default ["seven"]
12140 [Thread-19] INFO backtype.storm.daemon.executor - Processing received message source: split:5, stream: default, id: {}, ["seven"]
12140 [Thread-19] INFO backtype.storm.daemon.task - Emitting: count default [seven, 21]

12156 [Thread-19] INFO backtype.storm.daemon.executor - Processing received message source: split:6, stream: default, id: {}, ["seven"]
12156 [Thread-19] INFO backtype.storm.daemon.task - Emitting: count default [seven, 22]


12159 [Thread-19] INFO backtype.storm.daemon.executor - Processing received message source: split:7, stream: default, id: {}, ["seven"]
12159 [Thread-19] INFO backtype.storm.daemon.task - Emitting: count default [seven, 23]

参考としては,作者の一人のNathan Marzのプレゼンが凄く分かりやすかったです.
ETE 2012 - Nathan Marz on Storm on Vimeo