Développer une application Big Data avec Hadoop

Mettre en place des clés composites

Testez gratuitement nos 1271 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Découvrez les writables. Il s'agit des formats sérialisables d'Hadoop utilisés pour passer des données entre les mappers et les reducers.
09:34

Transcription

Nous venons de mettre en place notre map Reduce d'import dans HBase, cependant, nous avons utilisé des textes qui concatènent des différentes valeurs. Ceci est relativement peu propre et il serait plus pertinent d’utiliser des types composites, c'est-à-dire des Writable que l'on crée sur mesure. En clé, nous utilisons un texte qui concatène, séparés par une virgule, le nom de la station ainsi que la date. Nous pourrions créer un Writable qui ferait ceci. Comme c'est une clé, il faut qu'elle hérite de l'objet Writable, mais surtout qu'elle implémente l'interface WritableComparable. On a StationDateWritable qui va implémenter le WritableCOmparable. Cela permettra de lui dire qu'il est triable et qu'il peut être utilisé comme clé puisqu'une clé a besoin d'être triée, dans le cadre d'Hadoop. Le WritableComparable de l'objet StationDateWritable. On voit qu'on a besoin d'un ensemble de méthodes pour implémenter un Writable, et notamment un WritableComparable readFields et Write, qui permettent de lire et d'écrire, de façon sérialisée, les données et compareTo, qui permet de le rendre Comparable. Notre Writable va comprendre au minimum deux éléments qui vont être une string avec la station. Et une date enregistrée proprement au format Date de JavaUtil. On va pouvoir faire un Constructeur, qui va être un StationDate - il s'agit bien de Date et pas de Data - Writable. Et qui va prendre en paramètre une Station et une Date. On va initialiser directement les paramètres à partir de cela, en faisant un this.station = station et this.date = date. Il est nécessaire, pour un Writable, d'avoir un constructeur sans argument. Cela permet à Hadoop de construire la structure et de pouvoir sérialiser les données dedans. À chaque fois, nous allons mettre des « getters » et des « setters », nous allons les faire générer par Eclipse, en faisant un Source, Generate, Getters and Setters. Nous cochons ce que nous voulons. Il nous crée directement le getStation, cette station, getDate, cette date. Nous pouvons, à présent, nous attaquer au readField. Il doit permettre de lire, à partir d'un DataInput, les champs et de les pré-remplir grâce à la version sérialisée. Pour cela, nous avons des utilitaires qui peuvent nous aider. Notamment, on a un WritableUtils, classe utilitaire, dans apache.hadoop.io, qui a une méthode : readString, permettant de lire une chaîne de caractères, à partir d'un DataInput. Ainsi, on relie, en premier, une string qui va correspondre à la station, et le mettre directement dans notre attribut Station. Et de lire une chaîne de caractères qui va correspondre à notre date. Cette date, nous allons pouvoir la Parser, nous allons faire SimpleDateFormat (SDF) sur un format qu'on va enregistrer en statique en haut, qui sera le format dans lequel nous sérialisons la date. On va le mettre en « protected.static » DATE_FORMAT, qui sera, par exemple : « yyyyMMdd ». L'année sur quatre chiffres, le mois et le jour. Il nous manque, ici, le string. Nous avons notre Simple Date Format, que nous initialisons, que nous instancions. Et nous allons stocker ça dans un DateFormat qu'on va appeler DF. Nous pouvons désormais faire un date = DF.parse de notre chaîne fraîchement lue. Il ne reste plus qu'à gérer l'exception, on va mettre ça dans un Try Catch. Nous venons de voir la dé-sérialisation et maintenant, nous devons écrire la méthode Write pour la sérialisation. Il faut forcément sérialiser dans le même sens. C'est-à-dire, si on a lu une chaîne de caractères puis une date, il faut qu'on dé-sérialise une chaîne de caractères puis une date. On va utiliser le WritableUtils.writeString qui va écrire une chaîne de caractères sur un DataOutput. On met le DataOutput : Out et la chaîne de caractères : Station. De la même façon, on va faire un WriteString pour la date, cependant, il nous faut d'abord la formater dans le bon format. Pour cela, on va réutiliser notre SDF et on va faire un df.format(station). Nous venons d'écrire notre méthode Read et notre méthode Write pour sérialiser et dé-sérialiser nos données de l'objet Writable. Il nous reste à faire la méthode CompareTo, qui doit comparer deux StationDateWritable. Pour cela, nous allons comparer la station en faisant compareStation, qui est un INT, qui va être un station.compareTo de o.getStation. On compare la station actuelle avec celle de l'autre objet. Si c'est 0, on va devoir faire un traitement spécifique, car ça veut dire que la station est égale. S'il n'est pas 0, on peut directement ressortir le résultat. Si c'est 0, c'est que c'est égal, il faut que l'on compare les dates, on va faire un date.compareTo de o.getDate. Il faut, pour avoir un objet Java complet, avoir au minimum la méthode Equals, où on va coder très rapidement, on va vérifier si o est une instance de StationDateWritable. On va l'appeler « o », pour la peine, et si c'est le cas, les stations sont égales et les dates sont égales. Pour cela, on vérifie getStation.equals de o.getStation. Il me manque une parenthèse pour la faire, j'ai o.getSation, voilà, et on va vérifier, de l'autre côté, que date.equals de o.getDate. C'est que O n'est pas une instance de StationDateWritable et on peut, a priori, ressortir directement False. Il nous faut également le hashCode qui est essentiel pour Hadoop. Effectivement, il nous faut ré-implémenter cette méthode puisqu'Hadoop va répartir les Writable sur les différents Reducers, grâce à cette méthode. On va se baser sur les méthodes hashCode des objets sous-jacents, c'est-à-dire Station.hashCode, qu'on va multiplier par un nombre premier + Date.hashCode, par exemple. On va donc avoir un hashCode unique et généré pour le Writable.

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 !