Développer une application Big Data avec Hadoop

Agréger les données dans un reducer

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Récupérez les données à partir de types complexes dans la fonction Reduce. Puis, agrégez-les selon les besoins métier.
08:17

Transcription

Donc, maintenant que nous avons fait notre « Mapper », nous allons faire notre « Reducer », qui consiste à faire l'agrégation des données qui lui sont passées. Alors, nous allons créer un nouveau « Reducer ». Par exemple, notre « AggregatorReducer ». qui va, donc, étendre directement la classe « Reducer ». En entrée, on prend la sortie du « Mapper », c'est-à-dire, entre les « TwoDimensionsWritable ». En valeur, un « IntWritable » et on va écrire, en sortie, rien du tout dans la clef, c'est-à-dire un « NullWritable » et un « Text » qui apparaitra directement dans le fichier, en valeur. Nous avons fait cela, nous pouvons désormais demander à [-] méthode « Reduce ». Et, nous allons pouvoir coder le « Reducer » dedans. La première chose à penser est qu'il va falloir que l'on ait un opérateur sur lequel on va travailler. De la même façon que l'on a fait pour les dimensions, les opérateurs possibles, nous allons les lister dans un « enum » que nous allons mettre directement sur la classe. Donc, on a un « enum Operator » qui va pouvoir être « SUM, AVG, MIN, MAX, RANGE ». Et, on va se faire une variable « Operator » que l'on va nommer « op » et que l'on va initialiser, à « Operator.valueOF("SUM") ». Pour mettre, en brut, notre « Operator » à « SUM ». Dans le « Reduce », on va avoir un « switch » sur l'« Operator ». Et, en fonction de l'« Operator », on ne va pas faire la même chose. Par exemple, faisons le cas pour l'opérateur « SUM ». Dans le cas d'un opérateur « SUM », on va parcourir l'ensemble des valeurs. Donc, on va faire un : for « (IntWritable value : values) ». Et, dans ce cas-là, on va incrémenter le résultat, à chaque fois, de « value.get» Alors, on peut supposer que dans tous les cas, on va avoir une variable « result » qui va être un « Int » et que l'on va initialiser à zéro. Donc, dans le cas de « SUM » on parcourt toutes les « values ». Alors, Eclipse ne nous a pas mis les bons noms de paramètres, « key »,« values » et « context ». Et, désormais, on voit bien que l'on parcourt toutes les « values » et que l'on rajoute, à chaque fois, la valeur à la variable « result ». Il ne nous reste plus qu'à écrire la sortie. Alors, on va faire un « context.write », on sait que le premier paramètre est un « NullWritable », on le récupère en faisant un « NullWritable.get », [-] qu'il n'y a aucun coût à récupérer, ainsi. Le second va être un texte, on peut faire un « new TEXT ». En passant, on va écrire la « Dim1, Dim2 », et, virgule, le résultat. Alors, pour avoir la « Dim1 », c'est sur la clef « key.getDim1 », on va rajouter le séparateur « "," », on va écrire « key.getDim2 », on va rajouter le séparateur « "," » et on va rajouter la valeur « result ». On vient de faire notre « Reducer », il faudrait, cependant, que l'on gère un peu plus de « case ». On a géré le cas de la « SUM », on peut gérer, également, le cas « AVG ». Pour cela, on va faire deux variables temporaires : le « totalValue » que l'on initialise à zéro et le « countValues » que l'on initialise, aussi, à zéro. On va parcourir l'ensemble des valeurs à chaque fois, pour avoir une variable locale « value ». Et, on va incrémenter le « totalValue » avec la valeur « value.get ». On va incrémenter le « countValues », result, calculé en dehors de notre boucle, sera donc le « totalValue », la somme totale de toutes les valeurs divisée par le nombre de valeurs, c'est-à-dire par « countValues ». On vient d'implémenter « AVG » et on peut voir qu'il y a d'autres implémentations possibles pour les deux autres opérateurs. En attendant, on va mettre un « default » qui ne fait rien, ainsi, « result » restera à vide. On va rajouter aussi les « break », qui peuvent servir, dans le cas d'un « switchcase ». Notre « Reducer » est, désormais, fait. Tout est bon. On va pouvoir, réellement, passer à la suite et exécuter notre « Mapper » puis notre « Reducer ». Alors, pour ce faire, nous allons devoir créer un « Driver ». Nous allons créer une nouvelle classe et l'appeler « ProcessorDriver ». Je vous propose une version de ce « Driver » que je crée, directement. On voit que l'on a mal nommé notre « Driver », tout-à-l'heure, Il ne s'agit pas de « Qchn » mais de « Ghcn ». On va renommer le « Mapper ». On va en profiter pour corriger les « Import » et les « Warning ». Donc, nous avons notre « Mapper Ghcn », on fait « ProcessorDriver » qui étend « configured » et qui implémente l'interface « Tools ». On a une méthode « main » qui crée un nouveau « ProcessorDriver » et le lance grâce à « ToolRunner.run ». Cette méthode « Run » va instancier un nouveau job, donc « MapReduce », définir son nom et demander via la méthode « TableMapReduceUtil.initTableMapperJob » de réaliser un « Mapper » sur la « Table Ghcn », grâce à un scan définit juste au-dessus, avec le type de clef et de valeur de sortie du « Mapper », qui sont « TwoDimensionsWritable » et « IntWritable ». Quand au « Reducer », on a « AggregatorReducer » avec, comme format de sortie, un « TextOutputFormat » et un « OutputPath » dans le répertoire « /data/aggregated data » de « hdfs ». On lui demande d'exécuter 10 « Reducer ». On va donc pouvoir, désormais, lancer notre « Job » directement grâce à la commande « Java » avec le « classPath » qui est le « classPath » d'« hbase » qu'on obtient grâce aux [-] et à la commande « hbase classpath » auquel [-] notre « JAR ». Alors, on n'oublie surtout pas d'exporter notre « JAR » dans Eclipse en cochant toute « monapp » et en exportant « monapp.jar » et en l'écrasant. On met, ici, « monapp.jar » et on met le chemin, enfin le nom de la classe complet, vers l'exécutable, vers la classe qui possède la méthode « main ». Il s'agit, pour nous, de « processor.ProcessorDriver ». Notre code va alors se lancer si, du moins, le répertoire sur l'« hdfs » n'existe pas. On peut le supprimer et il faut le faire à chaque fois que vous le relancez pour pouvoir relancer, enfin, la commande « java - classpath » et que cela lance notre « Job ».

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 !