Développer une application Big Data avec Hadoop

Lire les données de HBase dans un mapper

Testez gratuitement nos 1304 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Avec votre formateur, apprenez à parcourir les données de HBase, étape préliminaire au développement du code métier.
11:06

Transcription

Maintenant que nous avons importé nos données, nous allons pouvoir faire le processus de calcul et qui va agréger nos données, groupées selon les groupes définis. Avant tout, nous allons renommer le paquet, nous allons tout déplacer dans un package : « importer ». Et nous allons créer un nouveau package : « processor ». Dans ce package, nous avons un mapper qui va lire à partir de HBase. On va donc avoir notre : « QhcnMapper » qui va lire à partir de la table Qhcn, donc il doit hériter directement de TableMapper afin d'être pré-configuré pour HBase. Pour le moment, on va lui faire ressortir un Text et un Int. Comme c'est un writable, il s'agit d'un IntWritable. On va faire développer la méthode Map. Dans notre méthode Map, la première chose à faire est de récupérer les entrées. on voit que les entrées sont en « ImmutableBytesWritable », pour la clé et un Result pour la valeur. Un HBaseClientResult pour la valeur. L'« ImmutableBytesWritable » correspond à un tableau d'octets qui est « immutable », qui ne peut pas être modifié. Cela correspond à notre clé de ligne sous HBase et nous allons directement le récupérer en faisant un « key.get » qui va nous donner un tableau d'octets et utiliser la classe utilitaire « Bytes » de hadoop.hbase.util, avec notamment « Bytes.toString », on voit qu'on peut directement mettre des limites, Path et [inaudible], choses dont on va se servir. On va faire un « Bytes.toString » de « key.get » de 0 et 11 pour récupérer uniquement le nom de la station. On va sauvegarder tout ça dans une string qu'on va nommer : « station ». OK, on est très bien, il nous faut aussi récupérer la date. Concernant la date, on sait qu'il est dans la ligne de HBase, la colonne nommée : « date : rien ». En effet, famille de colonne : date, identifiant de colonne : rien. Pour ce faire, on va pouvoir faire un « value », notre Result, « .getValue ». Où on met en tableau d'octet la famille et l'identifiant. En famille, on met un « Bytes.toBytes » puisqu'il le faut en tableau d'octet, de « date », en minuscules, et un « Bytes.toBytes » de rien. Ceci va nous retourner un tableau de Bytes qui va correspondre à notre valeur, donc à notre date. On va le convertir en string, « Bytes.toString » et on va pouvoir le passer grâce à un « DateFormat » Ce « DateFormat », on va l'initialiser directement en attribut. On va le passer « df.parse » et tout ça va nous donner un objet Date. Il nous reste à gérer l'exception - d'abord, il nous reste à importer l'objet Date, et à gérer l'exception, on va mettre tout ça dans un Try Catch. On a récupéré le nom de la station, on a récupéré la date, directement. Il nous faut également récupérer les mesures. Pour récupérer les mesures, c'est un petit peu plus compliqué puisqu'on ne peut pas faire un « getValue », vu qu'on ne connaît pas le nom des colonnes, c'est dynamique. Cependant, on peut faire, sur l'objet Value, un ListCell, qui permet de récupérer l'ensemble des cellules. On va itérer dessus : Cell, une cellule qu'on va itérer parmi value.ListCells. Tout de suite, on va regarder si c'est de la famille Date, dans ce cas-là, on va ignorer. Pour cela, on a une classe utilitaire qui s'appelle CellUtil, où on va regarder le matchingFamily entre une Cell et un nom de famille. Deux familles : notre Cell, c'est Cell et le nom de famille : « Bytes.toBytes » de date. Au passage, il est conseillé d'enregistrer l'ensemble des informations dans des attributs statiques, notamment de faire un « protected static » « Bytes[]DATE = ». On peut faire la même chose pour le NULL. On va pouvoir les réutiliser tout du long et éviter cet appel à Bytes.toBytes. Ici, on va pouvoir mettre directement Date, NULL, ici, et réutiliser DATE, ici. Si la famille est DATE, on sait qu'on peut ignorer la cellule, on a déjà traité la date, on veut traiter uniquement les mesures. Au passage, on aurait pu faire l'inverse : si c'était bien Mesure, comme famille de colonne, dans ce cas-là, le prendre en compte. On va récupérer le nom de la mesure. Pour ça, on va utiliser, toujours dans CellUtil, un Clone-qualifier qui va être l'identifiant de colonne, donc ce qui suit « mesure:TA », « TemperatureAverage » : « TAvg ». Sur notre cellule, on va le stocker dans une string qui va être « measure ». Bien entendu, il faut le convertir de Bytes en String. On va également récupérer la valeur de la mesure, qu'on va prendre à partir de CellUtil.cloneValue. Et il faut que l'on convertisse en INT, avec un « Bytes.toInt ». Il nous faut envoyer ces valeurs via un Context.write. Je vous propose de le faire grâce à un Writable créé pour l'occasion, plutôt que de le faire dans un texte, on va faire une nouvelle place, « TwoDimensionsWritable » que je vous propose de fournir tout préparé. C'est une classe, tel qu'on l'a déjà fait, elle implémente Writable / Comparable et est composée de Team 1 et Team 2, des getters, des setters, un readField un Write, un compareTo, un Impulse et un hashCode. On va modifier notre code pour ne pas renvoyer un texte mais un TwoDimensionsWritable en clé, ici et ici. Et nous pouvons directement instancier cet objet. Il nous faut récupérer ces deux dimensions. Pour le moment, on va faire un Enum, qu'on va laisser dans la classe avec les différentes dimensions possibles et on va instancier deux variables : Dim 1 et Dim 2. Sans trop se poser de questions, on va les mettre à une valeur en fixe, donc pour le moment, Dimension.valueOf et on va utiliser, par exemple, STATION pour Dim 1 et pour Dim 2, on va mettre MONTH, en brut, dans notre code. On a fait Dim 1 et Dim 2 et on va faire une méthode qui va permettre de récupérer, pour une ligne de l'HBase donnée, les valeurs des dimensions, en fonction de Dim 1 et de Dim 2. Je vous propose la méthode toute prête, ici, pour ne pas s'attarder trop sur le développement de cette méthode, c'est la méthode quatre dimensions, qu'on va mettre dans notre classe, qui va prendre la dimension et toutes les informations de notre ligne et qui va retourner la chaîne correspondant à cette dimension. On peut désormais, dans notre FOR, réaliser l'écriture du couple clé / valeur à passer en sortie du mapper, faire un context.write, avec, comme clé, un TwoDimensionsWritable qui va prendre Dim 1 et Dim 2. Juste auparavant, on va faire : « Dim 1 = getDimension(dim1) », on ne va pas l'appeler Dim1, ici, mais Dim1value, en passant tous les paramètres et Dim2 de la même façon. On remarque qu'il faut la date, qu'on a pas forcément car elle est dans le TRY, il faut donc mettre tout ce code dans le Try Catch. En effet, si on a pas la date, on ne va pas « parser » cette donnée. On a mis le TwoDimensionsWritable avec Dim1value et Dim2valeur en clé. La valeur, on la récupérait dans mValue, il s'agit donc d'un IntWritable(mValue). Voilà, nous avons terminé notre Mapper, nous pouvons passer à notre Reducer.

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 !