Taste of Tech Topics

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

Storm0.8.0公開。何が新しくなったんでしょう?

こんにちは。kimukimuです。

つい先日、Stormの最新版、0.8.0の開発版リリースが公開されました。
Stormのダウンロードページから取得可能

0.7→0.8・・・ということで、マイナーバージョンアップにも見えますが、
現状まだ開発中バージョン(0系)のため、実質的にはメジャーバージョンアップに近い位置づけだと思います。

とりあえず、追加された機能について挙げてみますね。
尚、nathanmarzさんが投稿している0.8.0リリース通知を基にしています。

1.Storm0.8.0になって何が新しくなったの?

細かいバグフィックスとかは置いておいて、大きな項目だけ説明しますね。
・・・後、内容的にはこれまでのこのブログのStormの記事を一通り読んでいることが前提になっています。
あしからず。

1.Spout/Boltと、それを実行するリソースであるExecutorの分離

一番の目玉です。
Storm0.8.0になって、これまでスレッド1本と関連づいていたSpout/Boltから
実行リソース(スレッド)としてのExecutorが分離されました。

・・・とこれだけ書くと何が何だかわからないとは思います(汗

要は、ボトルネックがどこかで発生したらExecutorを追加することで
性能の調整が可能になった、ということです。

これまではSpout/Boltの数はTopology起動時にしか指定できないため、
Spout/Boltの数のバランスを誤ってボトルネックが発生した場合には
Topologyを一度終了させるしかありませんでした。
それが後から動的にExecutorを追加することで解消可能となっています。

なら最初からSpout/Boltの数を増やせるようにすればいいではないかという突っ込みもありますが、
それは「どのTupleをどのBoltに配信するか?」を制御するConsistentHashingとの兼ね合いもあり、
難しいという形になっています。

2.Stormクラスタ内でSpout/Boltを再配分可能になった

Executorの分離にも関連するのですが、
実行スレッドとSpout/Bolt(モデル)を分離することで、
Stormクラスタ内の配置を移動させることが可能になっています。

例えば、
『データベースに接続するマシンは1台に絞りたいので、
 データベースから値を読み込むSpoutは特定のマシンに配置したい!』ということも
可能になりました。

3.スループットの向上

Storm0.8.0になって、0.7系と比べて性能が5倍〜10倍に向上しました。
・・・とこれだけ書くと赤くなったのか、それともインチキかとも取られるのですが、
下記の2つの理由により性能が向上したとのことです。

  • 内部のメモリキューイングにLMAX Disruptorを使用するようにした

LMAX Disruptorという並行処理フレームワークを内部のメモリ操作に利用しています。
何故早いかというと、「CPUキャッシュの性質を押さえた上で利用し、高速処理を実現している」からだそうです。
・・・この辺はCPUのキャッシュ階層化というアーキテクチャの話に突入するのでここでは省略します。

  • Tupleの処理が間に合わない時、受信側でTupleを自動でバッファリングして処理するようにした

毎回通信等を行うのではなくまとめることで全体としての無駄を省いた構成になったそうです。

4.定期実行を各Bolt側で保持して実行可能となった

データベースに値を格納する等の定期的な処理をBolt側に持たせることで、
タイムラグなどなしに実行可能となりました。

これまではBoltで定期処理をしたければ
Spoutから一定周期ごとにTupleを流す必要があったのですが、
今後はBoltで自前で持つことが可能となった形になります。

5.Storm UIの改善

Storm UIからTupleの送信状況の概要が見れるようになりました。

6.リソースを抽象化して制御可能となった(一部開発中)

こちらもExecutorの分離に関連するのですが、
クラスタ、Supervisor、Workerといったリソースを抽象化して取得/制御可能となっています。

7.Zookeeperへの負荷軽減

状態を格納するZookeeperへの負荷が10分の1程度になったため、
より少ないZooKeeperNodeでStormクラスタが運用可能になりました。

・・・と、盛りだくさんのバージョンアップでした。

2.Storm0.8.0になって何がうれしくなったの?

一番大きいのは、これまでTopologyの実行を始めたら実行し続けるだけで
後付けの調整ができなかったものがExecutor分離/リソース抽象化によって
制約はあるものの調整可能となったということだと思います。

後は性能も向上しているため、より高機能なクラスタを実現可能にもなっています。
どんどん機能が追加されてきているため、今後も楽しみですね!