Taste of Tech Topics

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

Storm0.9.0-rc1で何が新しくなったの?

こんにちは。kimukimuです。

最近気温の変化が激しくて、夜暑くて夏の格好で寝ると途中で寒くて目が覚める・・・
というのが普通にある今日この頃です。
皆さんもお大事に。

さて、先週StormがApacheプロジェクトとなったことについて投稿しましたが、
Stormで大きなニュースがまた一つ出ました。

Storm0.9.0-rc1のリリースです。
rcで正式版ではないのか、という突っ込みもありますが、
このバージョンは「0.9.0正式版リリースに向けた最終リリース確認バージョン」という位置づけのため、
そう遠くないうちに正式な0.9.0としてリリースされることが見込まれます。

1.Storm0.9.0の新機能/変更

Storm-Nettyの登場

まず、もっとも影響の大きな機能変更点として、「通信レイヤをZeroMQとNettyどちらを使うか選択可能になった」があります。

これまではStormの動作にZeroMQ(+Javaの言語バインディング)のインストールが必須となっていため、
ZeroMQをインストールできないWindows上では動作しなかったり、OS依存のパッケージがどうしても存在していました。

ですが、Nettyを選択可能になったことにより、PureJavaなアプリケーションとして動作するようになりました。
#正確に言うと「通信部分がプラグイン方式に変わった」という改修であるため、
#ZeroMQでもないNettyでもない通信コンポーネントを作りこめば、設定のみで差し替え可能になっています。
結果、OSへの依存が無くなり、インストールが容易になり、より広い環境で動作するようになった・・・というわけですね。
Windowsにそもそもインストールする方がいるのかという疑問はさておき。

ですが、機能的に実現できるようになったといっても、速度や負荷についてはまだ疑問が残ります。
なので、今度別個性能の比較はしてみようと思います。

その他新機能/変更点

Storm0.9.0のはStorm-Nettyの追加がメインで、それ以外は主にStorm0.8.2の機能改善が行われた形になります。
その中で個人的に気になった点をいくつかピックアップしますね。

ロギングフレームワークLog4jから今時のフレームワークに換装されました。
Logbackだとログ出力設定の動的更新なども出来るため、ありがたいところですね。

  • WorkerプロセスのJVMオプションにTopologyId、Workerポート、WorkerIdが追加

これもある意味地味な更新ですが、これによってTopology毎に別々のログファイルに結果を出力することが可能になります。
これまではWorker-6700...という形でしかログファイル名を指定できず、
どのTopologyのログファイルかがわからなかったため嬉しいところですね。

  • メトリクス機構の追加

Stormの統計的な情報を取得するメトリクスの機構が追加されました。
これまでは性能としてわかるのはStorm-UIでわかる値くらいで、
それ以上は自前でTaskhookの機構を用いて作りこむか、ログを仕込むなどをしないとわからなかったのですが、
Storm側でそういった機構をより作りやすく提供されるようになりました。

  • Storm-UIでTopology名毎にソートされるようになった

Topology一覧が見やすくなりました。

  • 設定ファイルの設定誤りによるエラーログが見やすくなった

実際に設定をミスした際にどこが悪いかわかりやすくなっています。

ログ出力時にどのSpout/Boltで出力されたメッセージかがスレッド名から判別できるようになりました。
また、問題解析時のスレッドダンプ取得やリモートデバッグ時にも構成がわかりやすくなりました。

  • TridentSpoutが動作中に取得先を変えられるようになった

TridentSpoutが動作中にメッセージの取得先を変えることができるインタフェースが追加されました。
大きな問題には対応できませんが、若干動的な設定が可能になった・・・という形ですね。

  • Ackerスレッドのデフォルトスレッド数がWorkerプロセスあたり1個になった

Stormのメッセージ処理機構を使った際に鍵となるAckerプロセスのデフォルトスレッド数が変更されました。
Workerプロセスが多くなり、処理性能が増大すると真っ先にAckerがボトルネックとなり、スレッドを変更することが必要だったので
その設定がある程度自動的に行われるというのはうれしいですね。

Tupleのシリアライズを行うクラスを差し替え可能になったため、
極端に大きなTupleを送る場合などに効率的なシリアライズが可能になっています。

  • ビルド環境のleiningen 2.0化

・・・これを嬉しいと思うのは相当マニアックなのかもしれませんが、ビルド環境が最新になったのはうれしいところですね。
Stormのソースコード(Clojure部)の確認を行ったり、Storm自体の改造を行う際にわざわざ環境を古いものに切り戻さずに済むのは大きいです。

2.Storm0.9.0で解消された不具合

MLのチェンジログには載っていませんが、
Stormのローカルファイルの状態とZooKeeperの状態が食い違った状態になった際に
Supervisorが起動しなくなる問題が解消されています。
 → 解消するにはStormのローカルファイルを削除して再起動させる必要がありました。このためにClojureのコードと格闘したことが・・・
WorkerプロセスやSupervisorプロセスをkillコマンドで終了した際はかなりの頻度で起動に失敗する状態になっていたため、
頻繁に遭遇する問題が対処されているというのはうれしいですね。

3.Storm0.9.0で最終的に何が嬉しいの?

Storm0.9.0の改修内容をまとめると、大きく下記の2点になると思います。

  1. Storm0.8.2使用時に出ていた運用時/問題解析時の使いにくい点が改善された
  2. 様々なコンポーネントがプラグイン方式となり、アプリケーションに応じて適したプラグインを適用可能になった

以前のStorm-Tridentのように決して派手な機能が追加されたわけではありませんが、
実際にStormを実システムに適用した際に問題となる点が解消され、
後はプラグインによってアプリケーション別のカスタマイズの余地が拡大された形になっています。

個人的にはStorm-0.9.0はある意味「貯め」のバージョンで、
次に来ると思われるStorm-1.0.0でまた大きな機能の追加が行われるのではないかという期待がありますが・・・どうでしょう^^;

今回のバージョンアップでかなり使いやすくなったため、
これまでStormを使ったことが無い方も、使ったことがある方も是非最新のバージョンを使ってみてください。
このブログでも一部の機能については実際に試して結果を書いてみようと思います。

それでは。