夢とガラクタの集積場

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

Stormの内部実装を解説する資料確認してます(その4

前回に引き続き、Topologyのライフサイクルの章について読み進めます。

Topologyのライフサイクル

Topologyモニタリング

=====
Nimbusは起動している間ずっとTopologyのモニタリングを行う。
1.Timerスレッドにて定期的にTopologyモニタリングタスクが実行される
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L623)

2.Nimbusの動作は有限状態マシン(active/inactive/killed/rebalancing)として示される。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L98)

3.モニタイベントは「設定値:nimbus.monitor.freq.secs」秒ごとに呼び出される。
  モニタイベントにおいて、reassign-transitionメソッドからreassign-topologyメソッドを呼び出す。

4.reassign-topologyメソッドはmk-assignmentsメソッドを呼び出す。
  このメソッドは初期にTopologyをアサインする際にも呼び出される。
  mk-assignmentsメソッドはインクリメンタルにTopologyを更新可能。
  −mk-assignmentsメソッドはHeartBeatを検知し、必要に応じてWorkerの再アサインを行う
  −これらの再アサインはZookeeperの状態を更新することで行われる。
   状態更新をトリガーとして、SupervisorはWorkerの開始/終了を行う。
=====
Zookeeperを介して状態更新が行われるので、意外にシンプルにすんでいるのかもしれませんね。

Topologyの終了

=====
■storm killコマンドを実行することにより、NimbusThriftインタフェースを通してTopology終了処理が開始する。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/command/kill_topology.clj)

Nimbusは下記のコードにて、killコマンドを受信する。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L671)

NimbusはTopologyの状態を「kill」に遷移させる。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L676)

■kill状態遷移のメソッドはTopologyの状態を「kill」に遷移させ、removeイベントを一定時間(設定値)後に実行するようセットする。
1.removeイベントの待ち時間デフォルト値はTopologyのメッセージタイムアウト値と同じ。ただ、storm killコマンドの-wフラグで上書き可能。
2.kill遷移時、Topologyの状態は待ち時間の間実際にシャットダウンするまでの間「非Active」となる。
  Topologyシャットダウンの待ち時間は現状処理中のTupleがWorker終了までに処理完了となるためのバッファとなっている。
3.このTopologykillの状態遷移は終了待ちの間にNimbusがクラッシュしても維持されることを保証している。
  Nimbusは起動時にTopologyのステータスが「killed」だった場合、Removeイベントを一定時間後に実行するよう設定するためである。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L111)]

■TopologyのRemoveタスク実行時にZooKeeperのTopology情報についても削除を行う。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L116)

■独立したクリーンアップスレッドも別個起動し、HeartBeat用のローカルディレクトリとTopology用の設定値ファイル/Jarファイルが削除される。
(https://github.com/nathanmarz/storm/blob/0.7.1/src/clj/backtype/storm/daemon/nimbus.clj#L577)
=====

比較的終了については単純な内容になっていました。
Topologyに関連するファイルについてもあわせて削除される・・・ということが明確になったのはよかったです。

これで、Topologyライフサイクルについても終了し、
次はTuple処理の肝であるMessage Passingになります。