13 votes

Réutiliser la JVM dans les tâches mapreduce Hadoop

Je sais que nous pouvons définir la propriété "mapred.job.reuse.jvm.num.tasks" pour réutiliser les JVM. Mes questions sont :

(1) comment décider du nombre de tâches à définir ici, -1 ou d'autres entiers positifs ?

(2) est-ce une bonne idée de réutiliser déjà les JVM et de définir cette propriété à la valeur de -1 dans les travaux de mapreduce ?

Merci beaucoup !

23voto

Thomas Jungblut Points 11072

Si vous avez des tâches très petites qui s'exécutent définitivement les unes après les autres, il est utile de définir cette propriété à -1 (ce qui signifie qu'une JVM générée sera réutilisée un nombre illimité de fois). Ainsi, vous générez simplement (le nombre de tâches dans votre cluster disponibles pour votre tâche) de JVM au lieu de (le nombre de tâches) de JVM.

Ceci est une énorme amélioration des performances. Dans les tâches de longue durée, le pourcentage du temps d'exécution par rapport à la mise en place d'une nouvelle JVM est très faible, donc cela ne vous apporte pas une énorme amélioration des performances.

De plus, dans les tâches de longue durée, il est bon de recréer le processus de la tâche, en raison de problèmes comme la fragmentation du tas qui dégrade vos performances.

De plus, si vous avez des tâches s'exécutant sur une période intermédiaire, vous pourriez réutiliser simplement 2 à 3 tâches, ce qui représente un bon compromis.

1voto

Ashu Points 300

La réutilisation de la JVM (uniquement possible dans MR1) devrait aider à améliorer les performances car elle supprime le délai de démarrage de la JVM, mais elle est seulement marginale et présente un certain nombre d'inconvénients (effets secondaires). La plupart des tâches s'exécuteront pendant longtemps (des dizaines de secondes, voire des minutes) et les temps de démarrage ne sont pas le problème lorsque l'on regarde ces temps d'exécution des tâches. Vous aimeriez démarrer une nouvelle tâche sur une ardoise vierge. Lorsque vous réutilisez une JVM, il y a une chance que le tas ne soit pas complètement propre (il est fragmenté des exécutions précédentes). La fragmentation peut entraîner davantage de GC et annuler tous les gains de temps de démarrage. S'il y a une fuite de mémoire, cela pourrait également affecter l'utilisation de la mémoire, etc. Il vaut donc mieux démarrer une nouvelle JVM pour les tâches (si les tâches ne sont pas raisonnablement petites). Dans MR2 (YARN) - une nouvelle JVM est toujours démarrée pour les tâches. Pour les tâches Uber - elle exécutera la tâche dans la JVM locale uniquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X