Apache Storm のコア概念
Apache Storm は、一方の端からリアルタイム データの生のストリームを読み取り、それを一連の小さな処理ユニットに渡し、もう一方の端で処理済みの有用な情報を出力します。
次の図は、Apache Storm の中心となる概念を説明しています。
次に、Apache Storm のコンポーネントを詳しく見てみましょう -
##コンポーネント | 説明 |
Tuple | Tuple は、Storm の主要なデータ構造です。これは順序付けられた要素のリストです。デフォルトでは、タプルはすべてのデータ型をサポートします。通常、これはカンマ区切りの値のセットとしてモデル化され、Storm クラスターに渡されます。 |
ストリーム | ストリームは、順序のないタプルのシーケンスです。 |
スパウト | ストリームのソース。通常、Storm は Twitter ストリーミング API、Apache Kafka キュー、Kestrel キューなどの生データ ソースから入力データを受け入れます。それ以外の場合は、データ ソースからデータを読み取るためのスパウトを作成できます。 "ISpout" はスパウトを実装するためのコア インターフェイスであり、特定のインターフェイスには IRichSpout、BaseRichSpout、KafkaSpout などがあります。 |
ボルト | ボルトは論理処理単位です。スパウトはデータをボルトとボルトのプロセスに渡し、新しい出力ストリームを生成します。ボルトは、フィルタリング、集計、結合、データ ソースやデータベースとの対話などの操作を実行できます。ボルトはデータを受信し、それを 1 つ以上のボルトに送信します。 「IBolt」は、Boltsを実装するためのコアインターフェイスです。一般的なインターフェイスには、IRichBolt、IBasicBolt などがあります。 |
「Twitter Analytics」のリアルタイムの例を見て、Apache Storm でどのようにモデル化されるかを見てみましょう。以下の図はその構造を示しています。
「Twitter Analytics」への入力は Twitter Streaming API から取得されます。 Spout は Twitter Streaming API を使用してユーザーのツイートを読み取り、タプルのストリームとして出力します。スパウトからの 1 つのタプルには、twitter ユーザー名と 1 つのツイートがカンマ区切りの値として含まれます。このタプルのストリームは、Bolt に転送され、Bolt はツイートを個々の単語に分割し、単語数をカウントし、設定されたデータ ソースに情報を保存します。データ ソースにクエリを実行することで、簡単に結果を取得できるようになりました。
トポロジー
スパウトとボルトは互いに接続されてトポロジーを形成します。リアルタイム アプリケーション ロジックは、Storm トポロジで指定されます。簡単に言えば、トポロジは、頂点が計算、エッジがデータ フローである有向グラフです。
単純なトポロジは注ぎ口から始まります。スパウトは 1 つ以上のボルトにデータを送信します。ボルトは、最小限の処理ロジックを備えたトポロジ内のノードを表し、ボルトの出力を入力として別のボルトに出力できます。
Storm は、終了するまでトポロジを実行し続けます。 Apache Storm の主な仕事は、トポロジを実行し、同時に任意の数のトポロジを実行することです。
クエスト
これで、スパウトとボルトについての基本的なアイデアが得られました。これらはトポロジの最小論理単位であり、トポロジは単一のスパウトおよびボルト配列を使用して構築されます。トポロジを正常に実行するには、これらを特定の順序で正しく実行する必要があります。 Storm によって実行される各スパウトとボルトは「タスク」と呼ばれます。簡単に言えば、タスクはスパウトまたはボルトの実行です。各スパウトとボルトでは、同時に複数の個別のスレッドで複数のインスタンスを実行できます。
プロセス
トポロジは、複数のワーカー ノード上で分散方式で実行されます。 Storm は、すべてのワーカー ノードにタスクを均等に分散します。ワーカー ノードの役割は、ジョブをリッスンし、新しいジョブが到着したときにプロセスを開始または停止することです。
ストリーム グループ化
データはスパウトからボルトへ、またはあるボルトから別のボルトへ流れます。フロー グループ化は、トポロジ内でタプルがどのようにルーティングされるかを制御し、トポロジ内のタプルの流れを理解するのに役立ちます。以下に説明する 4 つの組み込みグループがあります。
ランダム グループ化
ランダム グループ化では、Bolt を実行するすべてのワーカーに同数のタプルがランダムに分散されます。以下の図はその構造を示しています。
フィールドのグループ化
タプル内の同じ値を持つフィールドはグループ化され、残りのタプルは外部に保存されます。同じフィールド値を持つタプルは、ボルトを実行する同じプロセスに転送されます。たとえば、ストリームがフィールド「word」によってグループ化されている場合、同じ文字列「Hello」を持つタプルは同じワーカーに移動されます。次の図は、フィールドのグループ化がどのように機能するかを示しています。
グローバル グループ化
すべてのストリームをグループ化して 1 つのボルトに転送できます。このグループ化により、ソースのすべてのインスタンスによって生成されたタプルが単一のターゲット インスタンスに送信されます (具体的には、最も低い ID を持つワーカーが選択されます)。
すべてのグループ化
すべてのグループ化では、各タプルの 1 つのコピーが、受信側のボルトのすべてのインスタンスに送信されます。このグループ化は、Bolt に信号を送信するために使用されます。すべてのグループ化は結合操作に役立ちます。