Développer une application Big Data avec Hadoop

Optimiser ses modèles MapReduce

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Apprenez à vous servir des combiners. Ainsi, vous améliorerez facilement les performances de vos éléments MapReduce.
08:32

Transcription

Maintenant que nous avons développé nos MapReduce, nous allons voir comment améliorer nos performance et les optimiser, grâce à quelques techniques. La première consiste en la réutilisation des Writables. En effet, dans le Mapper et dans le Reducer, nous allons régulièrement instancier des writables, notamment au moment de l'écriture donc de la clé de valeur, c'est-à-dire dans le contexte d'un Write. Alors cette opération d'instanciation est très coûteuse, il vaut mieux donc les réutiliser. Alors la technique est relativement simple, elle consiste simplement à garder un attribut correspondant à notre writable directement dans la classe, donc par exemple faire un TwoDimensionsWritable, directement Key dans la classe et à la rigueur l'instancier directement, sans aucune donnée. Et de réutiliser donc ceci, alors on ne va pas l'appeler « Key » parce que Key est déjà utilisée, mais on va l'appeler donc, TwoDimensions Writable et de le réutiliser à chaque appel de map, simplement en modifiant les valeurs. Donc ici, nous allons faire TwoDimensionsWritable, .setDim1, donc de dim1value, .setDim2, de dim2value, et .setValue de mValue. Ici, nous pouvons donc directement passer en clé le TwoDimensionsWritable. Et ça nous évite de réinstancier à chaque fois, l'objet Writable. Il faut faire la même chose même pour les Writables qui sont issus directement d'Hadoop, en effet, même si ce n'est pas nous qui les avons écrits, il les très coûteux de les réinstancier. Donc toujours pareil, nous allons instancier le Writable une fois la création de la classe et nous allons directement mettre à jour sa valeur ici. Alors c'est une méthode qui est peu coûteuse et qui permet d'optimiser directement les valeurs, je vous invite et je vous recommande de le faire systématiquement. Alors nous allons vérifier que nous avons pas d'autre instanciation de Writable dans le reste de notre code. Tout semble OK pour notre Mapper. Regardons à présent dans le Reducer et nous voyons donc que nous avons un NullWritable.get qui lui, n'est pas une instanciation mais la récupération directement d'un Singleton, ça n'a donc aucun coût. Par contre nous avons un NewText, qui par contre va nous intéresser. Et nous allons faire ici directement un protectile, text, que nous appelons Text. Et que nous instancions. Voici ceci est une première technique d'optimisation. Il y en a une seconde, qui s'appelle les « combiners ». Le principe du combineur est de pouvoir réaliser une opération d'agrégation intermédiaire, entre le Mapper et le Reducer. Notamment, l'objectif du combineur va être de réaliser cette agrégation avant les transferts réseaux, aussi on va agréger entre si possible, tous les résultats d'un Mapper donné, avant de les transférer, de les grouper, de les « sorter » pour les éventuels Reducers, derrière. Alors le combineur consiste, s'il est possible, souvent à faire la même opération, ou du moins une opération très similaire au Reducer. En effet, on réalise en fait la même agrégation, simplement, on la réalise à une étape précédente. Alors il faut noter que dans le cadre d'un combineur, notre combineur doit pouvoir s'exécuter 0 fois, une fois ou plusieurs fois, sur tout ou partie des données, sans modifier le résultat final. Il est uniquement là pour réduire le volume de données qui va arriver au Reducer. Et donc de réduire le transfert des données entre les Mappers et les Reducers. Alors écrire un combineur est très simple. Il s'agit en fait d'écrire un Reducer, effectivement, cela a exactement le même format. Ça va juste être lancé sur une partie des données, cependant, ce Reducer va avoir une particularité. Il va devoir avoir forcément les mêmes types en entrée, qu'en sortie. Puisqu'il doit pouvoir s'exécuter donc zéro, une ou plusieurs fois, sans changer les données réellement. Donc on va devoir mettre le même type en entrée et en sortie, et adapter de ce fait-là, également, la signature de la méthode Reduce. Une fois que l'on a fait ça généralement, comme je vous le disais, on a sensiblement le même code que dans notre Reducer, sauf que forcément il ne faut plus écrire la même chose ici, mais donc, directement notre clé, et potentiellement, simplement, le résultat combiné. Alors écrire un combineur n'est pas toujours réalisable et ce n'est pas toujours possible. Il faut voir avec notre algorithme si cela est adapté et si cela peut fonctionner. Donc nous faisons notre combineur, nous le faisons retourner à NewIntWritable et afin de profiter de l'optimisation, nous allons en fait, retourner un intWritable qui aura été directement instancier en haut de notre classe, et que l'on mettra à jour directement juste avant de l'écrire. Une fois donc que nous avons notre combineur, ah, nous l'avons interverti avec le Reducer, en modifiant la mauvaise classe. Ce n'est pas grave, nous allons le corriger. Voilà, donc ici nous avons notre agregatorReducer. Il nous manque le package. Et ici, donc nous avons le combineur. Tout cela étant fait, nous pouvons à présent adapter notre driver, pour rajouter le fait qu'il va devoir utiliser le combineur, grâce à la méthode setCombinerClass, donc nous allons passer myCombiner en classe. Enfin, il est bon de savoir qu'il y a encore une autre technique d'optimisation qui permet d'optimiser les comparators en les faisant directement sur les tableaux d'octets. Cela permet d'éviter la désérialisation et la resérialisation des données, afin de les comparer. Pour cela, il faut alors faire directement un Compare sur les tableaux d'octets. Implémenter cette méthode directement sur tableau d'octets, et potentiellement ici, appeler la méthode Super avec false, qui permet de spécifier de ne pas désérialiser les objets pour les comparer.

Développer une application Big Data avec Hadoop

Concevez une application Big Data avec la suite Hadoop. Stockez des données dans l'HDFS et dans HBase, traitez-les en MapReduce sous YARN, exportez-les dans MySQL via Sqoop, etc.

2h31 (25 vidéos)
Aucun commentaire n´est disponible actuellement

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !