ツイッターがStormをオープンソース化した。これは分散された、フォールトトレラント なリアルタイム計算システムで GitHub に、Eclipse Public License 1.0 の下でリリースされた。Stormは今ではツイッターの傘下にある BackTypeによって開発されたリアルタイム処理システムである。GitHub から入手できる最新パッケージは、 Storm 0.5.2 であり、ほとんどが Clojureで書かれている。
Stormは分散リアルタイム計算を実行する一般的な基本セットを提供している。「ストリーム処理」、メッセージ処理、データベースのアップデートをリアルタイムで行うために使うことができる。これはキューやワーカーの自分自身のクラスタを管理する代替になる。「継続的な計算」、データストリームに対する連続的なクエリの実行、計算された時にユーザーに結果をストリームアウトするのに、 Stormは使うことができる。また「分散RPC」、立ちどころに高価な計算を並列に行うためにも使うことができる。Stormのリードエンジニアである Nathan Marz氏によると、
Stormによって、コンピュータクラスタ上で複雑なリアルタイム計算を書いたり、スケールするのが簡単になります。Hadoopがバッチ処理のためにやっていることをリアルタイム処理でやります。Stormはすべてのメッセージが処理されるのを保証します。速いかって?小さなクラスでも1秒で何百万のメッセージを処理できます。特に、どんなプログラミング言語を使ってもStorm Topologiesを書くことができます。
Stormの重要な特性は以下です。
- 単純なプログラミングモデル。 MapReduceが並列なバッチ処理の複雑さを緩和したのと同様な方法で、Stormはリアルタイム処理の複雑さを緩和した。
- どのようなプログラミング言語も走らせることができる。Stormの上でどんなプログラミング言語でも使うことができる。 Clojure, Java, Ruby, Pythonが既定でサポートされている。
- フォールトトレラント。Stormはワーカープロセスとノード故障を管理する。
- 水平方向にスケーラブル。計算は複数のスレッド、プロセス、サーバーを使って並列に行われる。
- 保証されたメッセージ処理。各メッセージは少なくと1度だけ完全に処理されることをStormは保証する。
- 速い。メッセージが速やかに処理され、下層のメッセージキューとしてOMQを使うようにシステムは設計されている。
- ローカルモード。Stormには「ローカルモード」があり、完全に動作中のStormクラスタをシミュレートする。
Stormクラスタはマスターノードとワーカーノードからできている。マスターノードは、"Nimbus"と呼ばれるデーモンを走らせ、これはコードの分散、タスクの割り付け、故障のチェックを担っている。各ワーカーノードは "Supervisor"と呼ばれるデーモンを走らせ、ワークを待ち受け、ワーカープロセスを開始したり、停止したりする。Nimbus と Supervisorはフェイルファーストでステートレスなので、堅牢であり、両方の協調動作は、 Apache ZooKeeper によって行われる。.
Storm用語には Streams, Spouts, Bolts, Tasks, Workers, Stream Groupings, Topologiesがある。Streamは処理中のデータ。 Sproutはデータソース。 Boltがデータを処理する。Taskは Spout あるいは Bolt内で走るスレッド。Workerはこれらスレッドを走らせるプロセス。Stream GroupingはどのデータをBoltが入力として受け取るかを特定する。データはランダムに分散化 (Shuffle)、フィールド値(Fields)による「固定」、ブロードキャスト化(All)でき、いつもシングルタスクへ行く (Global)、どうでも良い(None) あるいは、カスタムロジックにより決められる(Direct)かである。 TopologyはStream Groupingによって接続されたSpoutと Boltのネットワークである。これらの用語は Storm Concepts ページにもっと詳しく書かれている。
Stormと肩を並べるシステムには、Esper, Streambase, HStreaming 、Yahoo S4 がある。これらの内、最も近いシステムはS4である。 Storm と S4間の大きな違いは、Stormはメッセージ処理を保証していることである。これらのシステムのあるものは、Stormが持たない組込みのデータストレージ層を持っている。もし永続化が必要であれば、 Storm Topologiesでは Cassandra やRiakのような外部データベースを使う必要がある。
始めるのにいい方法は、 GitHubにある公式の Storm Tutorialを読むことである。様々なStormの概念や抽象化について説明してあり、 サンプルコードもあるので、Storm Topologyを走らせることができる。開発中は、ローカルマシンでStormをローカルモードで走らせ、トポロジーを開発、テストできる。準備ができたら、コンピュータクラスタ上で実行するためにStormをリモートモードにして、トポロジーをサブミットする。 Mavenユーザーは、 clojars.orgのリポジトリ http://clojars.org/repoからStorm依存関係を使うことができる。
Storm Clusterを走らせるには、Apache Zookeeper, OMQ, JZMQ, 、Java 6 と Python 2.6.6が必要である。 ZooKeeperはクラスタの様々なコンポーネントを管理するのに使われ、OMQは内部のメッセージングシステムとして使われ、JZMQはOMQのJavaバインディングである。storm-deploy というサブプロジェクトもある。これによって、AWS上にStormクラスタをワンクリックでデプロイできる。詳細な説明は Storm Wikiにある Setting up a Storm cluster(Stormクラスタの設定)を読んで欲しい。
Stormについてもっと知りたければ、公式の Storm Wiki に行って欲しい。Storm メーリングリスト やStorm IRC (#storm-user)に自由に加わることもできる。