夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Storm0.8.2をビルドしてみる

こんにちは。

ここ数日暑過ぎて半分溶けている感覚がする今日この頃です。

溶ける・・・とは全く関係ないのですが、
最近Stormのコア側に一部修正を入れて試してみたいことがあったので、ビルドをした時の手順をまとめてみます。
対象バージョンはまずは現状の正式リリースとなっている0.8.2で。

尚、現在の開発版である0.9.0ではモジュール分割もされてよりビルドは複雑化しています。
そのため、とりあえず自分で正式版に手を入れて試してみよう、というのが今回の目的になりますね。
では、やってみましょう。

1.必要となる環境

JDKの他に、Clojureの依存性解決ツールであるLeiningenが必要となります。
後はStormを動作させるのに必要なzeromqとjzmqのインストールも必要ですが、それについてはStorm-Installerを確認してください。

Leiningenの現状の最新バージョンは「2.3.0」なのですが、
Storm0.8.2の「project.clj」を見てみると以下のような記述があり、Leiningenの1系でないと動作しないようです。

(if-not (re-find #"^1\..*$" lein-version)
  (do (println (str "ERROR: requires Leiningen 1.x but you are using " lein-version))
    (System/exit 1)))

そのため、1系のインストールから始めてみます。

2.Leiningen1系のインストール

LeiningenGithubのreleasesページより、1系の最終バージョンである「1.7.1」をダウンロードします。
https://github.com/technomancy/leiningen/releases

何故かwgetコマンドで取得するとファイルが1.7.1という名前になってしまったので、
リネームしてから解凍しています。

$ cd /opt
$ wget https://github.com/technomancy/leiningen/archive/1.7.1.tar.gz
$ mv 1.7.1 1.7.1.tar.gz
$ tar xvzf 1.7.1.tar.gz
 → /opt/leiningen-1.7.1配下にファイルが展開
$ ln -s leiningen-1.7.1 leiningen

上記のコマンドの上で、「/opt/leiningen/bin」にパスを通します。

$ which lein
/opt/leiningen/bin/lein

パスを通したら、以下のコマンドを実行してみます。

$ lein self-install
 → Leiningenの関連ファイルがインストールされる
$ lein help
which: no rlwrap in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jruby/bin:/opt/leiningen/bin)
Leiningen is a tool for working with Clojure projects.

Several tasks are available:
classpath   Print the classpath of the current project.
clean       Remove compiled class files from project.
compile     Compile Clojure source into .class files.
deploy      Build and deploy jar to remote repository.
deps        Download all dependencies and put them in :library-path.
help        Display a list of tasks or help for a given task.
install     Install the current project or download the project specified.
interactive Enter interactive task shell.
jar         Package up all the project's files into a jar file.
javac       Compile Java source files.
new         Create a new project skeleton.
plugin      Manage user-level plugins.
pom         Write a pom.xml file to disk for Maven interop.
repl        Start a repl session either with the current project or standalone.
retest      Run only the test namespaces which failed last time around.
run         Run a -main function with optional command-line arguments.
search      Search remote maven repositories for matching jars.
test        Run the project's tests.
test!       Run the project's tests after cleaning and fetching dependencies.
trampoline  Run a task without nesting the project's JVM inside Leiningen's.
uberjar     Package up the project files and deps into a jar file.
upgrade     Upgrade Leiningen to specified version or latest stable.
version     Print version for Leiningen and the current JVM.

と、こんな感じでleiningenが動作するようになりました。
ですがrlwrapが無いというエラーも発生しているため、rlwrapもインストールしてしまいます。

$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm
$ yum -y install rlwrap

これでOK。leinを実行した時にエラーが発生しなくなりました。
これでまずleiningenのインストールは完了です。

3.Stormをビルドしてみる

では、実際にStormをビルドしてみます。
こちらもGitHubからソースzipをダウンロードすると何故か名前が変わるので、リネームを挟んでいます。

$ wget https://github.com/nathanmarz/storm/archive/0.8.2.zip
$ mv 0.8.2 storm-0.8.2.zip
$ unzip storm-0.8.2.zip
$ chmod +x storm-0.8.2/bin/build_release.sh
$ cd storm-0.8.2
$ bin/build_release.sh
(省略)
1    [main] ERROR org.apache.zookeeper.server.NIOServerCnxn  - Thread Thread[main,5,main] died
java.lang.UnsatisfiedLinkError: no jzmq in java.library.path, compiling:(zmq.clj:1)
(省略)

・・・という形でjzmqがjava.library.path上に存在しないというエラーになってしまいました。
Storm-Installerを使った場合64bit用のパスにjzmqがインストールされるため、そこも追加してやる必要がありそうです。

そのため、以下のようにproject.cljを修正します。

$ vi project.clj
  :jvm-opts ["-Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib:/usr/lib64"] // 末尾に「/usr/lib64」を追加

その上で、再度ビルドを実行してみます。

$ bin/build_release.sh
(省略)
Compilation succeeded.
Created /opt/build/storm-0.8.2/storm-0.8.2.jar
(省略)

ということで、storm自体をビルドできることが確認できました。
・・・正確には、「jvm.backtype.storm.generated」配下のパッケージの自動生成も試さないと完全なビルドというわけにはいかないんですが、
それはThriftのインタフェースを変えない限り必要にならないため、省略します。
影響範囲の関係上、そこに手を入れるつもりはありませんし。

ともあれ、これでStorm自体を改造する準備が整いました。
この先にClojure修正という壁がありますが、とりあえずやってみたいと思います。