[Storm] Ubuntu上でのStormのインストールとEclipse不要な開発環境の構築 (part 2, cluster mode編)[Storm] How to install Storm and prepare the development environment without Eclipse (part 2)

日が暮れるのも早くなり、秋を飛ばして冬が来そうな(=修論締め切りが近づいてきている)気配に心身ともに震え始めている学生の方の松浦です.

さて、今回は以前の記事の続きをご紹介します.
内容はStormをcluster modeで動作させる環境を整えるところまでです.(前回の記事では二回に渡ってご紹介するという旨の記述をしたように思いますが、分量的に大きくなりそうなので、本記事を含めて全3回になる予定です.)

下準備 – cluster modeで起動するために必要なモジュールのインストール

Stormをcluster modeで動作させるために必要なモジュールについて整理します.

  • Java6
  • Clojure (leiningen)
  • Python2.7*
  • ZooKeeper
  • ZeroMQ (JZMQ)**

このうち、Java6, Clojure, Python2.7については前回の記事でインストールを完了しました.従って今回は残りの2つについてインストールを行っていきます.

準備が完了したところで、いよいよStorm本体のインストールを行います.

Stormのインストール

前回の記事ではさらっと流してしまいましたが、storm-starterではStorm本体を利用していません.(Storm本体の機能に相当するjarがプロジェクトに含まれているためです.)今回の記事ではcluster modeとして実際に展開するため、ついにStorm本体のインストールを行います.

 それでは、Stormを早速ダウンロードしていきます.本記事では、/usr/localの配下にstorm-0.8.2というディレクトリを作成し、そこにStormを展開します.Storm本体は公式がzipで固めたものを配布してくれていますので、ダウンロードして解凍するだけで使えます.

いきなりですが、これでStormのインストールは終わりました.簡単すぎるくらいに簡単です.Stormの起動コマンドは/usr/local/storm-0.8.2/bin/stormです.今後Stormの新バージョンがリリースされたときのために、/usr/local/stormというシンボリックリンクを作成し、今後はこちらを参照することにします.pathもシンボリックリンクを利用して通しましょう.本記事では/etc/profileに直書きしてしまいます.

これでstormコマンドが使えるようになりました.ターミナル上で”storm”と叩いて以下の表示が得られれば成功です.ここで一点、注意事項があります.下記のstormというコマンドはPython2.7で書かれたものとなっています.そのため、普段はPython3系を使われている方は、Python2.7に切り替えて実行するよう、virtualenv等で設定を行っておいてください.

 これで、Storm自体のインストールは終了です.

動作確認

 本記事では、Stormがクラスタモードで起動したことを確認するために、

  • Nimbus
  • Supervisor
  • WebUI

といった順で起動・確認を行っていきます.

用語解説

 動作確認の前にStormクラスタにおけるノードやプロセスの名称について確認しておきます.

Nimbus

 クラスタ内におけるmaster nodeです.Hadoopでいうところのjob trackerに相当します.このnimbusとなったノードが処理のスケジューリングを行い、タスクをworkerに対して割り当ててくれます.また、このノードがクラスタ内におけるストリームを監視し、故障検知を行うことにより、Stormは耐障害性を実現しています.

Supervisor

 各処理ノード上で動作するdaemonです.上記のnimbusがmasterであり、このsupervisorがslaveとなります.Supervisorは自身に処理が割り当てられるのを待ち受けており、workerプロセスの起動・停止を担当しています.このsupervisorが立ち上げるwokerプロセスが、実際のtopologyを処理します.すなわち、supervisorが実行するworkerプロセスのスレッドとして、SpoutとBoltが動作するということです.

Apache Zookeeper

 言わずと知れたクラスタ環境のためのcoordinatorです.Stormではzookeeperを使ってnumbusとsupervisor間の情報を管理しています.各ノードの状態などを管理しており、supervisorの故障を検知するとタスクの再割り当てを行ってくれます.

Tuple

 Stormで処理されるデータです.Stormでいうstreamデータとは連続したtupleのことです.

Topology

 SpoutとBoltの組から構成されるネットワークトポロジです.SpoutとBoltはスレッドであるため、ここでいうtopologyが実際の物理的なネットワークトポロジと必ずしも等価ではないことに注意が必要です.

Spout

 Stormクラスタのtopologyにおけるstreamの始点です.キューイングされているデータを読んで、tupleとして整形し、それをstreamとして送信します.

Bolt

 クラスタにおけるworkerです.Spoutから流れてきたstreamを処理して、次のboltに送信します.

cluster modeで起動するための設定

 さて、それではいよいよ、Stormをcluster modeで起動していきましょう.

 Stormを動かすにあたり、3つのファイルを編集していきます.一つ目が/etc/zookeeper/conf/zoo.cfg、二つ目が/usr/storm/conf/storm.yaml、最後が~/.storm.yamlです.zoo.cfgがzookeeperに関する設定、二つ目がStormのシステムに関する設定、最後がStormをどういう用途で利用するかというユーザ側での設定になります.
 まずは/etc/zookeeper/conf/zoo.confから編集します./etc/zookeeper/conf/zoo_sample.cfgという雛形となるファイルがあるため、zoo.cfgという名前でコピーしてください.テキストエディタ等でこのファイルを開いてみると、デフォルトでは下記のような雛形が用意されていることがわかります.

基本的にはこのままで問題ありませんが、zookeeperのログを書き出すための設定を追加します.適当な行に以下の一行を追加してください.

 指定したディレクトリを作成します.

これでzookeeperの設定は完了しました.設定ファイル内に記述されていますが、zookeeperでは2181portを利用することを覚えておいてください.

 次に編集するのは/usr/local/storm/conf/storm.yamlです.これはStormを起動する際のシステム側の設定、zookeeperやnimbusに関する設定を記述するものとなっています.Stormを起動する際、デフォルトの設定では本家にあるdefaults.yamlの値が使われます.storm.yamlはこのdefaults.yamlをoverrideするようになっており、storm.yamlにて明示されていない内容はdefaults.yamlの値が使われます.それでは編集していきましょう.テキストエディタ等でこのファイルを開いてみると、デフォルトでは下記のような雛形が用意されていることがわかります.

今回は、ひとまずcluster modeで立ち上がっている、ということのみ確認するため、nimbus、worker、supervisor、zookeeperの全てをlocalhostだけという構成にしていきます.
 まずはzookeeperに関する設定から行います.Stormにzookeeperサーバのリストを教えるために、設定ファイルの二行目以下を次のように改変しましょう.

次にnimbusに関する設定を行います.Zookeeperの場合と同様に、numbusノードを教えるため、6行目の部分を以下のように設定します.

また、Stormがインストールされているディレクトリを明示するために、以下の内容を7行目に追加します.

雛形の9行目以降はオプショナルな設定なので、本稿では無視するものとします.完成した設定ファイルは以下の通りです.

これでStormのシステムに関する設定は完了です.

 さて、それでは次にStormを利用するためのユーザ側での設定を書いていきましょう.ユーザ側で設定すべきは、どのStormクラスタに対してtopologyを流し込むかという設定だけです.つまり、nimbusに関する設定のみ記述しておけば大丈夫です.~/.storm.yamlを以下のように作成しましょう.

以上でシステム、ユーザともに設定が完了しました.

 各プロセスを起動する前に、忘れずにfirewallの設定を変更しておきましょう.利用するポート一覧は次の通りです.各自のiptablesの設定を見直してください.

  • 2181: Zookeeper
  • 6627: Nimbus
  • 6700-6703: Supervisor(defaults.yamlの値より)

Stormの起動

 それではStormを起動しましょう.起動する順序としては、zookeeper -> nimbus -> supervisor -> ui となります.以下のコマンドを実行しましょう.

ブラウザからhttp://localhost:8080にアクセスして、StormのUIが表示されれば成功です.まだtopologyをsubmitしていないので、特に面白みはありませんが、無事に起動を確認することができました.尚、zookeeperはstopコマンドが用意されていますが、Stormにはないため、ps awx | grep storm などしてプロセス番号を調べてkillしてください.

 次回は実際にtopologyをsubmitしてどんなデータが流れているのかを観察してみましょう.

Masanao MATSUURA