記事ディレクトリ
インタビュー指向のブログは、Q / Aスタイルで提示されます。
質問1:Stormを簡単に紹介しますか?
回答1:
ストームは無料でオープンソースの分散型リアルタイムコンピューティングシステムです。Stormを使用すると、無制限のデータストリームを簡単に確実に処理できます。Hadoopがビッグデータをバッチ処理するように、Stormはリアルタイムでデータを処理できます。
以下に示すようなストームクラスタアーキテクチャ:
上の図の説明:
1. Nimbus(マスターとして、機能:コードをスーパーバイザーに配布)
Stormクラスターのマスターノードは、ユーザーコードを配布し、特定のスーパーバイザーノードのワーカーノードに割り当てて、トポロジーに対応するコンポーネント(Spout / Bolt)のタスクを実行します。 。
2.スーパーバイザ(スレーブとしての機能:ワーカープロセスの開始と終了の管理)
ストームクラスタのスレーブノードは、スーパーバイザノードで実行されている各ワーカープロセスの開始と終了を管理します。Stormの構成ファイルのsupervisor.slots.ports構成アイテムを使用して、スーパーバイザーで許可される最大スロット数を指定できます。各スロットはポート番号によって一意に識別され、ポート番号はワーカープロセスに対応します(ワーカープロセスが開始)。
3.ワーカー(
コンポーネントロジックを具体的に処理するプロセス)が、コンポーネントロジックを具体的に処理するプロセスを実行します。Workerが実行するタスクには、SpoutタスクとBoltタスクの2種類しかありません。
4.タスク
ワーカーの各スパウト/ボルトスレッドはタスクと呼ばれます。ストーム0.8以降、タスクは物理スレッドに対応しなくなります。異なるスパウト/ボルトのタスクは、エグゼキューターと呼ばれる物理スレッドを共有する場合があります。
5. ZooKeeperは
Nimbusとスーパーバイザーを調整するために使用され、スーパーバイザーが問題のためにトポロジーを実行できない場合、Nimbusはすぐにトポロジーを検知して再配布し、他の使用可能なスーパーバイザーで実行します。
質問2:Stormプログラミングモデルについて説明します(注ぎ口->タプル->ボルト)?
回答2:
Stromは、操作中にスパウトとボルトの2つのコンポーネントに分割できます。これらのコンポーネントのうち、データソースはスパウトから始まり、データはタプルモードでボルトに送信されます。複数のボルトを直列に接続したり、ボルトを複数のスポット/ボルトに接続したりすることもできます。 。
実行時の原則全体は次のとおりです。
上の画像の主な概念の説明:
1. Topology
Stormで実行されているリアルタイムアプリケーションの名前。SpoutとBoltを統合したトポロジグラフ。SpoutとBoltの組み合わせ関係、並行数、構成などを定義します。
2. Spout
は、トポロジー内のソースデータストリームのコンポーネントを取得します。通常、spoutは外部データソースからデータを読み取り、トポロジー内のソースデータに変換します。
3. Bolt
はデータを受け入れ、処理コンポーネントを実行します。ここで、ユーザーは必要な操作を実行できます。
4.
メッセージのグループとして理解される、タプルの1回限りのメッセージ送信の基本単位はタプルです。
5.ストリーム
タプルのコレクション。データの流れを表します。
質問3:トポロジの操作について話してください。
Answer3:
Stormでは、リアルタイムアプリケーションのコンピューティングタスクは、Hadoop MapReduceタスクと同様のトポロジーとしてパッケージ化およびリリースされます。ただし、1つの違いがあります。Hadoopでは、MapReduceタスクは実行が完了すると最終的に終了します。Stormでは、Topologyタスクが送信されると、停止しない限り終了しません。計算タスクトポロジは、データストリーム(ストリーム)を介してさまざまなスパウトとボルトで接続されたグラフです。ストームがクラスタでトポロジを実行すると、主に次の3つのエンティティを通じてトポロジの実行が完了します。
(1)。ワーカー(プロセス)
(2)。実行者(スレッド)
(3)。タスク
1.ワーカー(1つのワーカープロセスが1つのトポロジのサブセットを実行する)
1つのワーカープロセスが1つのトポロジのサブセットを実行する(注:1つのワーカーが複数のトポロジを提供することはありません)。ワーカープロセスは、トポロジコンポーネント(注ぎ口またはボルト)を実行する1つ以上のエグゼキュータースレッドを開始します。したがって、実行中のトポロジは、クラスター内の複数の物理マシン上の複数のワーカープロセスで構成されます。
2.エグゼキューター(エグゼ
キューターはワーカープロセスによって開始される別のスレッド)エグゼキューターはワーカープロセスによって開始される別のスレッドです。各エグゼキューターはトポロジの1つのコンポーネント(注ぎ口またはボルト)のタスクのみを実行します(注:タスクは1つ以上にすることができます。ストームのデフォルトは1つのコンポーネントが1つのタスクのみを生成し、エグゼキュータースレッドはそれぞれにありますすべてのタスクインスタンスは、2番目のループで順次呼び出されます)。
3.タスク(
最終的に注ぎ口またはボルトでコードを実行するユニット)タスクは、注ぎ口またはボルトでコードを最終的に実行するユニットです(注:1つのタスクは注ぎ口またはボルトの1つのインスタンスであり、実行中に実行スレッドがこのタスクを呼び出します) nextTupleまたはexecuteメソッド)。トポロジーが開始された後、コンポーネント(注ぎ口またはボルト)のタスクの数は固定されますが、コンポーネントによって使用されるエグゼキュータースレッドの数は動的に調整できます(例:1つのエグゼキュータースレッドはコンポーネントの1つ以上のタスクを実行できます)例)。これは、1つのコンポーネントに#threads <=#タスクという条件があることを意味します(つまり、スレッドの数はタスクの数以下です)。デフォルトでは、タスクの数はエグゼキュータースレッドの数と同じです。つまり、1つのエグゼキュータースレッドは1つのタスクのみを実行します。
質問4:ストームストリーミングのグループ化について話しますか?
Answer4:
ストリームのグループ化は、Stormで最も重要な抽象化です。スポット/ボルトに対応するタスクがタプルを配布する方法を制御し、ターゲットのスポット/ボルトに対応するタスクにタプルを起動できます。
現在、ストームストリーミンググループは次のタイプをサポートしています。
1.
ランダムグループをハッフルグループ化し、可能な限り下流のボルトに均等に分散して、フローグループを混合行として定義します。このシャッフルグループは、Spoutからの入力がシャッフルされるか、このボルトのタスクにランダムに分散されることを意味します。シャッフルグループは、各タスクのタプルをより均等に割り当てます。
2.フィールドのグループ化は
フィールドでグループ化され、データ内のフィールド値でグループ化されます。同じフィールド値のタプルは同じタスクに送信されます。このグループ化メカニズムにより、同じフィールド値のタプルは同じタスクに送られます。
3.すべてのグループ化:
各タプルのブロードキャストブロードキャスト送信は、処理のために各ボルトにコピーされます。
4.グローバルグループ
グローバルグループであるタプルは、トランザクショントポロジを実現するために、ボルト内のタスクに割り当てられます。Streamのすべてのタプルは同じボルトタスクに送信されて処理され、すべてのタプルは最小のtask_idを持つボルトタスクに送信されて処理されます。
5.グループ化なし:グループ化なし。
この方法は、並列処理の負荷分散戦略に注意を払わない場合に使用されます。これは現在、シャッフルグループ化と同等です。さらに、Stormはボルトタスクとその上流のデータ提供タスクを同じスレッドの下に配置します。
6.直接グループ化:直接グループ化はグループ化を指定します。
タプルの送信ユニットは、タプルの送信先のボルトを直接決定します。通常、タプルを受信して送信するボルトを決定するのはボルトです。これは特別なグループ化方法であり、このグループ化を使用すると、メッセージの送信者がメッセージ受信者のどのタスクでメッセージを処理するかを指定できます。このグループ化メソッドを宣言できるのは、Direct Streamとして宣言されたメッセージストリームのみです。また、このメッセージタプルは、emitDirectメソッドを使用して送信する必要があります。メッセージハンドラーは、TopologyContextを通じてメッセージを処理するメッセージのtaskidを取得できます(OutputCollector.emitメソッドもtaskidを返します)。