1

storm-starterの単純な単語カウント プログラムの場合、ロジックはかなり単純明快です
。1) 文を単語に分割する
2) 各単語を出力する
3) カウントを集計する (カウントをマップに格納する)

ただし、ここには 2 つの問題があります
。1) プログラムは集計部分を実行するために 12 の個別のスレッドを使用します。つまり、カウントは GLOBAL ではありません。グローバル カウントを取得するには、レイヤーをもう 1 つ追加する必要があります。
2) ボルトでは、マップはカウントを格納するために使用されます。これは、状態があることを意味します。現在のワーカーが失敗した場合、ボルトに格納されているすべてのカウントは失われますか? ストームはステートレスであるため、
3) 代わりにトライデントを使用してこれを達成する必要がありますか?

4

1 に答える 1

1

各ボルトには、グローバル状態の単語の 1/12 が含まれています。フィールドのグループ化により、特定の単語が毎回同じボルトに送信されるため、カウントはグローバルに正確になります。

https://storm.apache.org/documentation/Concepts.html

フィールドのグループ化: ストリームは、グループ化で指定されたフィールドによって分割されます。たとえば、ストリームが「user-id」フィールドによってグループ化されている場合、同じ「user-id」を持つタプルは常に同じタスクに送られますが、異なる「user-id」を持つタプルは異なるタスクに送られる可能性があります.

はい、ノードがクラッシュした場合、カウントは失われます。不正確さに対するアプリケーションの許容範囲と必要なパフォーマンス特性に従って、永続ストレージを使用する必要があります。

Trident は、1 回だけ処理を行う状態を構築するのに役立ちます (この例ではカウントします)。この例のバッキング マップが HBase の場合、ボルト クラッシュに対しては回復力がありますが、ボルトが再起動したときにデータが失われるか (ベスト エフォート処理)、または文のタプルが再生された場合 (少なくとも 1 回の処理) に単語のカウントが過剰になります。 . 物事を一度に数える必要がある場合は、トライデントが最適です。

于 2015-04-12T03:14:37.490 に答える