web-dev-qa-db-fra.com

Storm max bec en attente

C'est une question concernant le fonctionnement du bec max en attente de la tempête. J'ai actuellement un bec qui lit un fichier et émet un tuple pour chaque ligne du fichier (je sais que storm n'est pas la meilleure solution pour traiter des fichiers mais je n'ai pas le choix pour ce problème). Je règle le bec maximum en attente sur 50k pour limiter le nombre de n-uplets à traiter dans la topologie. Cependant, je vois que ce nombre n’a aucun effet sur la topologie. Je vois tous les enregistrements d'un fichier émis à chaque fois. Mon hypothèse est que cela pourrait être dû à une boucle que j'ai dans la méthode nextTuple qui émet tous les enregistrements d'un fichier. Ma question est donc la suivante: est-ce que la tempête arrête simplement d’appeler le prochain tuple pour la tâche de bec lorsque le bec maximum en attente est atteint? Est-ce que cela signifie que je ne devrais émettre qu'un seul Tuple à chaque appel de nextTuple?

16
Naresh

Exactement! Storm ne peut limiter votre bec qu'avec la commande suivante. Par conséquent, si vous transmettez tout lorsque vous recevez le premier message suivant, il n’ya aucun moyen pour Storm d’étouffer votre bec.

Les développeurs de Storm recommandent d’émettre un seul Tuple avec une seule commande suivante. La structure Storm va alors étrangler votre bec si nécessaire pour répondre à l'exigence "bec max en attente". Si vous émettez un grand nombre de n-uplets, vous pouvez grouper vos émissions au maximum jusqu'à un dixième de votre débit maximal en attente, afin de donner à Storm la possibilité d'accélérer.

18
John Gilmore

Les topologies Storm ont un paramètre de débit max en attente. La valeur en attente maximale En attente pour une topologie peut être configurée via le paramètre “Topology.max.spout.pending” dans le fichier de configuration de la topologie . Cette valeur limite le nombre de Nuplets pouvant être en vol, c’est-à-dire qu’ils n’ont pas encore été reçus ou échoués, dans une topologie de Storm à un moment donné. La nécessité de ce paramètre Vient du fait que Storm utilise ZeroMQ pour distribuer Des nuplets d’une tâche à une autre. Si le côté consommateur de ZeroMQ ne parvient pas à suivre la cadence de transfert, la file d'attente ZeroMQ commence à se constituer. Finalement, les tuples expirent au bec Et sont rejoués à la topologie, ce qui ajoute plus de pression à Sur les files d'attente. Pour éviter ce cas d'échec pathologique, Storm Permet à l'utilisateur de limiter le nombre de n-uplets en cours de vol. Dans la topologie. Cette limite prend effet sur une tâche par bec Et non sur une topologie. ( source ) Dans les cas où les becs ne sont pas fiables, c'est-à-dire qu'ils n'émettent pas d'identifiant de message dans leurs n-uplets, cette valeur est sans effet. L’un des problèmes auxquels les utilisateurs de Storm sont continuellement confrontés est que Trouve la bonne valeur pour ce paramètre de débit maximal en attente . Une très petite valeur peut facilement priver la topologie et Une valeur suffisamment grande peut surcharger la topologie avec un très grand nombre de n-uplets au point de provoquer des échecs et des rediffusions. Les utilisateurs ont passer en revue plusieurs itérations de déploiements de topologie avec différentes valeurs en attente de bec maximal afin de trouver la valeur qui leur convient le mieux.

15
kartik

Une solution consiste à créer la file d’entrée en dehors de la méthode nextTuple et la seule chose à faire dans nextTuple consiste à interroger la file et à l’émettre. Si vous traitez plusieurs fichiers, votre méthode nextTuple doit également vérifier si le résultat de l'interrogation de la file d'attente est null et, dans l'affirmative, réinitialiser de manière atomique le fichier source qui remplit votre file d'attente.

0
Gireesh Ramji