Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Stormを簡単にインストールする方法は?(その3

こんにちは。kimukimuです。

1.動作しない原因は?

前回StormがRPMインストールを行ったクラスタでうまく動作しなかったため、原因を確認してみます。

まずは前回のログを再度確認してみますと・・・

2012-07-01 20:46:07 worker [ERROR] Error on initialization of server mk-worker
java.lang.UnsatisfiedLinkError: no jzmq in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
        (中略)
	at backtype.storm.daemon.worker.main(Unknown Source)

java.library.path」にjzmqが無いとなっています。
なので、workerのログを確認し、「java.library.path」に何が設定されているかを確認してみると、下記のログが。

2012-07-01 20:46:02 ZooKeeperServer [INFO] Server environment:java.library.path=/usr/local/lib:/opt/local/lib:/usr/lib

つまりは「/usr/local/lib」「/opt/local/lib」「/usr/lib」のいずれの配下にも
ZeroMQ/JZMQのライブラリが存在しないということになるわけですね。

実際に確認してみますと・・・

// /usr/local/lib 配下を確認
[root@installtest ~]# cd /usr/local/lib
[root@installtest lib]# ls -l | grep zmq
// /opt/local/lib 配下を確認
[root@installtest lib]# cd /opt/local/lib
-bash: cd: /opt/local/lib: そのようなファイルやディレクトリはありません
// /usr/lib 配下を確認
[root@installtest lib]# cd /usr/lib
[root@installtest lib]# ls -l | grep zmq
[root@installtest lib]#

うん。見事に存在しません。
尚、Stormが動作するサーバにおいては同じディレクトリ配下を確認してみると下記の通りです。
/usr/local/lib配下にZeroMQ/JZMQ関連のライブラリファイルが配置してありますね。

// /usr/local/lib 配下を確認
[root@hyperion ~]# cd /usr/local/lib
[root@hyperion lib]# ls -l | grep zmq
-rw-r--r-- 1 root root  434806  55 04:33 2012 libjzmq.a
-rwxr-xr-x 1 root root     926  55 04:33 2012 libjzmq.la
lrwxrwxrwx 1 root root      16  55 04:33 2012 libjzmq.so -> libjzmq.so.0.0.0
lrwxrwxrwx 1 root root      16  55 04:33 2012 libjzmq.so.0 -> libjzmq.so.0.0.0
-rwxr-xr-x 1 root root  197036  55 04:33 2012 libjzmq.so.0.0.0
-rw-r--r-- 1 root root 4898066  55 04:23 2012 libzmq.a
-rwxr-xr-x 1 root root     958  55 04:23 2012 libzmq.la
lrwxrwxrwx 1 root root      15  55 04:23 2012 libzmq.so -> libzmq.so.1.0.0
lrwxrwxrwx 1 root root      15  55 04:23 2012 libzmq.so.1 -> libzmq.so.1.0.0
-rwxr-xr-x 1 root root 1985431  55 04:23 2012 libzmq.so.1.0.0
// /opt/local/lib 配下を確認
[root@hyperion lib]# cd /opt/local/lib
-bash: cd: /opt/local/lib: そのようなファイルやディレクトリはありません
// /usr/lib 配下を確認
[root@hyperion lib]# cd /usr/lib
[root@hyperion lib]# ls -l | grep zmq
[root@hyperion lib]#

上記の確認結果より、原因は「java.library.path」配下にZeroMQ関連のファイルが配置されていないことがわかりました。

2.何故こういう環境になったのか?

原因がわかったので、次は「何故こういう環境になったのか?」を確認してみます。
とりあえず、RPMファイルの中身を確認してみましょう。

// zeromqRPMの中身を確認
[root@installtest x86_64]# rpm -qlp zeromq-2.1.7-1.el6.x86_64.rpm
/usr/lib64/libzmq.so.1
/usr/lib64/libzmq.so.1.0.0
// ※以後docとman用のファイル
[root@installtest x86_64]# rpm -qlp zeromq-devel-2.1.7-1.el6.x86_64.rpm
/usr/include/zmq.h
/usr/include/zmq.hpp
/usr/include/zmq_utils.h
/usr/lib64/libzmq.a
/usr/lib64/libzmq.la
/usr/lib64/libzmq.so
/usr/lib64/pkgconfig/libzmq.pc
// ※以後docとman用のファイル
// jzmqRPMの中身を確認
[root@installtest x86_64]# rpm -qlp jzmq-2.1.0-1.el6.x86_64.rpm
/usr/lib64/libjzmq.so
/usr/lib64/libjzmq.so.0
/usr/lib64/libjzmq.so.0.0.0
/usr/share/java/zmq.jar
// ※以後docとman用のファイル
[root@installtest x86_64]# rpm -qlp jzmq-devel-2.1.0-1.el6.x86_64.rpm
/usr/lib64/libjzmq.a
/usr/lib64/libjzmq.la

・・・思いっきり/usr/lib64配下にインストールされてしまっていますね(汗
64bit版OS用としてRPMを作成したので、こういう形になってしまったんでしょうか・・・

3.解決方法は?

RPMファイルを32bit/64bitで分けて作成する関係上余りこれ以上変更したくありません。
なので、インストールしたライブラリを「/usr/local/lib」ディレクトリ配下から
シンボリックリンクで参照する形を取ります。

手順としては下記です。

[root@installtest x86_64]# ln -s /usr/lib64/libjzmq.a /usr/local/lib/libjzmq.a
[root@installtest x86_64]# ln -s /usr/lib64/libjzmq.la /usr/local/lib/libjzmq.la
[root@installtest x86_64]# ln -s /usr/lib64/libjzmq.so /usr/local/lib/libjzmq.so
[root@installtest x86_64]# ln -s /usr/lib64/libjzmq.so.0 /usr/local/lib/libjzmq.so.0
[root@installtest x86_64]# ln -s /usr/lib64/libjzmq.so.0.0.0 /usr/local/lib/libjzmq.so.0.0.0
[root@installtest x86_64]# ln -s /usr/lib64/libzmq.a /usr/local/lib/libzmq.a
[root@installtest x86_64]# ln -s /usr/lib64/libzmq.la /usr/local/lib/libzmq.la
[root@installtest x86_64]# ln -s /usr/lib64/libzmq.so /usr/local/lib/libzmq.so
[root@installtest x86_64]# ln -s /usr/lib64/libzmq.so.1 /usr/local/lib/libzmq.so.1
[root@installtest x86_64]# ln -s /usr/lib64/libzmq.so.1.0.0 libzmq.so.1.0.0
[root@installtest x86_64]# ls -l /usr/local/lib
合計 0
lrwxrwxrwx 1 root root 20  78 16:47 2012 libjzmq.a -> /usr/lib64/libjzmq.a
lrwxrwxrwx 1 root root 21  78 16:47 2012 libjzmq.la -> /usr/lib64/libjzmq.la
lrwxrwxrwx 1 root root 21  78 16:47 2012 libjzmq.so -> /usr/lib64/libjzmq.so
lrwxrwxrwx 1 root root 23  78 16:47 2012 libjzmq.so.0 -> /usr/lib64/libjzmq.so.0
lrwxrwxrwx 1 root root 27  78 16:47 2012 libjzmq.so.0.0.0 -> /usr/lib64/libjzmq.so.0.0.0
lrwxrwxrwx 1 root root 19  78 16:47 2012 libzmq.a -> /usr/lib64/libzmq.a
lrwxrwxrwx 1 root root 20  78 16:47 2012 libzmq.la -> /usr/lib64/libzmq.la
lrwxrwxrwx 1 root root 20  78 16:47 2012 libzmq.so -> /usr/lib64/libzmq.so
lrwxrwxrwx 1 root root 22  78 16:47 2012 libzmq.so.1 -> /usr/lib64/libzmq.so.1

この状態で再度起動を確認してみます。

4.再度動作確認

前回と同じく、
StormStarterのExclamationTopologyを用いて確認を行います。
Workerプロセスも同じく4個と設定します。

すると・・・下の画面の通り、Topology上でTupleの通信が無事行われています!

・・・という形でRPMでStormの前提ソフトウェアであるZeroMQ、JZMQが無事インストール可能であることを確認しました。
Storm自体は環境ごとに異なるユーザで動かす&展開すれば基本インストールは完了のため、
展開コマンドをまとめておけばいい・・くらいでしょうか。

とりあえずこれで共通的な環境構築は楽にできるようになりました。
#実際はシェルスクリプトでまとめる必要がありますが、それはそれで^^;

環境の構築に嵌っている方々いたら、RPMファイルは是非使ってください。