L'essentiel de Hadoop

Utiliser HBase dans les MapReduce

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Combinez HBase et les MapReduce pour lancer des traitements parallélisés en masse dans la base de données NoSQL d'Hadoop.
08:51

Transcription

Utiliser HBase dans le cadre de Map Reduce n'est pas très compliqué grâce à plusieurs méthodes utilitaires qui sont faites pour nous simplifier la vie. Alors première chose, c'est si on veut faire un Map Reduce il va falloir rajouter dans le Build Path, donc dans le Java Build Path, les propriétés de notre projet, réellement les JAR correspondant à usr/lib/hadoop-mapreduce et donc ces différents lib ainsi que les dépendances nécessaires. Une fois qu'on a rajouté tout ça, on va pouvoir développer des Map Reduce directement dans ce projet. Alors de façon analogue au développement de Map Reduce classique, on va créer une classe correspondant à notre Mapper, sauf que si on veut qu'elle puisse lire directement d'une table de HBase au lieu de la faire hériter de Mapper directement dans le paquet org.apache.hadoop mapreduce, on va la faire hériter de la classe TableMapper disponible dans org.apache.hadoop.hbase.mapreduce. Ceci va nous faciliter la vie et de ce fait-là, comme on sait qu'on publie directement à partir d'un TableMapper, on n'a pas besoin de mettre les clés et les formats des clés et valeurs d'entrée mais uniquement celles de sortie. Alors mettons ici Text, par exemple, pour faire simple. Et on voit que si on demande à Eclipse de préparer notre méthode Map directement, on va récupérer un ImmutableBytesWritable en clé et un Result en value, un hbase.client.Result en value. Alors le ImmutableBytesWritable est, comme son nom l'indique, un tableau d'octets immuable, c'est-à-dire qui ne peut être modifié. Pour le récupérer, on a juste à faire un get key.get. Ça va nous donner un tableau de bytes, si on veut le convertir en string, on utilise la classe utilitaire org.apache.hadoop.hbase.util.bytes sur lequel il y a les méthodes toString notamment. Ceci donc nous permet de lire et de récupérer directement la clé de notre ligne sous HBase. Concernant le Result, on va pouvoir faire un value. donc par exemple qui va correspondre à notre ligne le value, on va pouvoir faire un get.value par exemple dessus qui va permettre de spécifier la famille de colonne et l'identifiant de colonne que l'on veut récupérer et on va récupérer directement la valeur. Attention, bien entendu, tout est à spécifier en tableau d'octets et la valeur retournée est en tableau d'octets, il faudra donc la convertir avec des Bytes.toString ou toInt par exemple. De la même façon, on peut avoir un value.listCell qui permet de récupérer toutes les cellules correspondant à la ligne et de regarder sur les cellules quelles sont les identifiants de colonne et famille de colonne relatifs à la valeur. On peut également réaliser de manière simple un Reducer. Donc l'objectif du Reducer sur HBase va être qu'il va écrire sur HBase plutôt que d'écrire dans l'HDFS. On peut donc créer une classe MonReducer et de manière analogue, un Mapper. Il ne doit pas être dans la classe Reducer de Hadoop, le org.apache.hadoop.mapreduce mais il doit être dans TableReducer de org.apache.hadoop.hbase.mapreduce. On va donc créer cette classe. Et on voit ici qu'on a trois paramètres à rentrer. On a le KEYIN, le VALUEIN qui sont toujours les types de sortie de nos Mappers. Alors ici par exemple, mettons Text et Text juste pour l'exemple et on a un KEYOUT mais on a pas de VALUEOUT. En effet, HBase, la TableReducer va uniquement lire la valeur qui va lui être passée dans le couple de valeurs. De ce fait-là, peu lui importe la clé. Alors on peut lui passer une clé si on le souhaite, on peut également ne rien passer du tout. Donc on peut mettre ce qu'on veut ici, il faudra bien entendu le respecter lors de l'écriture avec le context.Write. La solution la plus simple pour ne rien passer, c'est d'utiliser un Nullwritable. Nullwritable, comme son nom l'indique, est un writable qui ne fait rien. Et on va pouvoir donc créer notre méthode Reduce qui prend, on a dit ici pour nous, un key et un Iterable de texte et un contexte et surtout on va pouvoir écrire à chaque fois, en l’occurrence un Nullwritable et une opération HBase. Alors, en opération HBase, on en a surtout deux, qui va être soit un Put permettant d'insérer dans HBase ou de modifier. Donc qui est un org.apache.hadoop. hbase.client.put et qui se crée de façon très simple, on fait juste un new Put en passant l'identifiant de la ligne que l'on veut insérer ou modifier. Ainsi donc, on peut faire un new Put. Alors il faut faire attention, Put bien entendu prend un tableau d'octets. N'hésitez pas à utiliser le Bytes.toBytes fourni par la classe utilitaire d'HBase. Donc par exemple, je veux modifier la ligne sgilliot. Et je vais passer sur le Put simplement des informations supplémentaires. Donc par exemple, je peux faire un addColumn où je précise la famille, l'identifiant de colonne et la valeur. Donc je vais mettre toujours avec des Bytes.toBytes, ma famille de colonne. Donc adresse, l'identifiant de colonne donc un Bytes.toBytes de rue et la nouvelle valeur que je veux lui transmettre. Alors bien entendu, comme on l'a déjà dit, à cet endroit-là du code on ne sait pas si on va insérer ou mettre à jour la valeur, ce n'est que quand HBase va d'ailleurs merger ces fichiers qu'il remplacera simplement les anciennes versions. Ici donc nous pouvons mettre par exemple Créqui. Ceci va donner des colonnes à notre Put et il ne reste plus qu'à envoyer le Put grâce à un context.Write. Alors context.Write, on sait que le premier argument c'est un Nullwirtable, le second c'est une mutation, une opération qu'on va réaliser sur HBase et ça va être notre Put. Pour avoir le Nullwritable, il faut utiliser la méthode get qui permet de récupérer le singleton de Nullwritable. Voilà, c'est pas coûteux du tout, c'est tout l'avantage d'utiliser un Nullwritable et on peut mettre notre Put en second argument. On vient d'envoyer cette opération à HBase. On pourrait également vouloir faire une suppression d'une ligne. Dans ce cas-là, on réaliserait une opération qui est un Delete, un hadoop.hbase.client.delete. Donc notre Delete, de la même façon, ce sera un New delete dans lequel on va passer la chaîne de caractères correspondant à l'identifiant de la ligne et on a juste à faire un context.Write de Nullwritable.get et de del. Alors, on a vu rapidement comment faire notre Mapper, comment faire notre Reducer, il faut cependant savoir quand même comment au minimum spécifier la base dans le Driver. Donc on va faire rapidement un Driver qui va avoir une méthode main et qui va lancer un nouveau job. Alors je vous rappelle, on fait job.getInstance. On va lui passer tous ses arguments donc au job directement. Et on va voir comment spécifier quelle table par exemple utiliser. Alors c'est relativement simple. Pour cela on utilise la classe utilitaire, donc TableMapReduceUtil qui a les méthodes notamment initTableMapjob qui permet de spécifier sur quelle table et quel job on veut lancer et la méthode utilitaire TableMapReduceUtil .initTableReducejob qui permet également de préciser dans quelle table cette fois-ci on va écrire quel Reducer on va lancer. Il est à noter que l'on peut spécifier un Scan dans le init TableMapjob afin notamment de filtrer les résultats qui vont sortir de HBase et qui vont arriver dans notre Mapper.

L'essentiel de Hadoop

Mettez en pratique les concepts spécifiques à Hadoop. Abordez l'HDFS pour le stockage, les MapReduce pour le traitement, ainsi que la base de données NoSQL d​e Hadoop : HBase.

3h43 (42 vidéos)
Aucun commentaire n´est disponible actuellement
Logiciel :
HBase HBase 1.2
Spécial abonnés
Date de parution :31 mars 2017

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 !