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 5月 5 04:33 2012 libjzmq.a -rwxr-xr-x 1 root root 926 5月 5 04:33 2012 libjzmq.la lrwxrwxrwx 1 root root 16 5月 5 04:33 2012 libjzmq.so -> libjzmq.so.0.0.0 lrwxrwxrwx 1 root root 16 5月 5 04:33 2012 libjzmq.so.0 -> libjzmq.so.0.0.0 -rwxr-xr-x 1 root root 197036 5月 5 04:33 2012 libjzmq.so.0.0.0 -rw-r--r-- 1 root root 4898066 5月 5 04:23 2012 libzmq.a -rwxr-xr-x 1 root root 958 5月 5 04:23 2012 libzmq.la lrwxrwxrwx 1 root root 15 5月 5 04:23 2012 libzmq.so -> libzmq.so.1.0.0 lrwxrwxrwx 1 root root 15 5月 5 04:23 2012 libzmq.so.1 -> libzmq.so.1.0.0 -rwxr-xr-x 1 root root 1985431 5月 5 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 7月 8 16:47 2012 libjzmq.a -> /usr/lib64/libjzmq.a lrwxrwxrwx 1 root root 21 7月 8 16:47 2012 libjzmq.la -> /usr/lib64/libjzmq.la lrwxrwxrwx 1 root root 21 7月 8 16:47 2012 libjzmq.so -> /usr/lib64/libjzmq.so lrwxrwxrwx 1 root root 23 7月 8 16:47 2012 libjzmq.so.0 -> /usr/lib64/libjzmq.so.0 lrwxrwxrwx 1 root root 27 7月 8 16:47 2012 libjzmq.so.0.0.0 -> /usr/lib64/libjzmq.so.0.0.0 lrwxrwxrwx 1 root root 19 7月 8 16:47 2012 libzmq.a -> /usr/lib64/libzmq.a lrwxrwxrwx 1 root root 20 7月 8 16:47 2012 libzmq.la -> /usr/lib64/libzmq.la lrwxrwxrwx 1 root root 20 7月 8 16:47 2012 libzmq.so -> /usr/lib64/libzmq.so lrwxrwxrwx 1 root root 22 7月 8 16:47 2012 libzmq.so.1 -> /usr/lib64/libzmq.so.1
この状態で再度起動を確認してみます。
4.再度動作確認
前回と同じく、
StormStarterのExclamationTopologyを用いて確認を行います。
Workerプロセスも同じく4個と設定します。
すると・・・下の画面の通り、Topology上でTupleの通信が無事行われています!
・・・という形でRPMでStormの前提ソフトウェアであるZeroMQ、JZMQが無事インストール可能であることを確認しました。
Storm自体は環境ごとに異なるユーザで動かす&展開すれば基本インストールは完了のため、
展開コマンドをまとめておけばいい・・くらいでしょうか。
とりあえずこれで共通的な環境構築は楽にできるようになりました。
#実際はシェルスクリプトでまとめる必要がありますが、それはそれで^^;
環境の構築に嵌っている方々いたら、RPMファイルは是非使ってください。