Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS 2015-2016

Documents pareils
Introduction à Hadoop & MapReduce

Certificat Big Data - Master MAthématiques

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Notes de cours Practical BigData

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

MapReduce et Hadoop. Alexandre Denis Inria Bordeaux Sud-Ouest France ENSEIRB PG306

Hadoop / Big Data MBDS. Benjamin Renaut <renaut.benjamin@tokidev.fr>

Programmation parallèle et distribuée (Master 1 Info )

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

7 Développement d une application de MapReduce

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

Map-Reduce : un cadre de programmation parallèlle pour l analyse de grandes données. Stéphane Genaud ENSIIE

Cloud Computing MapReduce Année académique 2014/15

Hadoop : une plate-forme d exécution de programmes Map-Reduce

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Big Data Concepts et mise en oeuvre de Hadoop

Hadoop : une plate-forme d exécution de programmes Map-Reduce

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Introduc)on à Map- Reduce. Vincent Leroy

Chapitre 2. Classes et objets

Introduction aux algorithmes MapReduce. Mathieu Dumoulin (GRAAL), 14 Février 2014

Fouillez facilement dans votre système Big Data. Olivier TAVARD

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

RMI le langage Java XII-1 JMF

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Introduction à MapReduce/Hadoop et Spark

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

MapReduce. Nicolas Dugué M2 MIAGE Systèmes d information répartis

ACTIVITÉ DE PROGRAMMATION

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Programmation par les Objets en Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Objet Java Correction

Android et le Cloud Computing

Cours 1: Java et les objets

Initiation à JAVA et à la programmation objet.

Remote Method Invocation (RMI)

Java DataBaseConnectivity

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

Chapitre 10. Les interfaces Comparable et Comparator 1

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Gestion distribuée (par sockets) de banque en Java

Programmation parallèle et distribuée

TP1 : Initiation à Java et Eclipse

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Projet de Veille Technologique

Java Licence professionnelle CISII,

La base de données XML exist. A. Belaïd

Premiers Pas en Programmation Objet : les Classes et les Objets

Tutoriel d installation de Hibernate avec Eclipse

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Web Tier : déploiement de servlets

Programmation parallèle et distribuée

Auto-évaluation Programmation en Java

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

OpenPaaS Le réseau social d'entreprise

TP1. Outils Java Eléments de correction

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Héritage presque multiple en Java (1/2)

TP1 : Initiation à Java et Eclipse

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Programmer en JAVA. par Tama

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Traitement de données

R+Hadoop = Rhadoop* Des logiciels libres complémentaires, une implémentation, une réponse au nouveau paradigme du bigdata!

Alfstore workflow framework Spécification technique

Corrigé des exercices sur les références

Synchro et Threads Java TM

TP, première séquence d exercices.

Technologies du Web. Ludovic DENOYER - ludovic.denoyer@lip6.fr. Février 2014 UPMC

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Utilisation d objets : String et ArrayList

Langage Java. Classe de première SI

Introduction à JDBC. Accès aux bases de données en Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours 8 Not Only SQL

TP Programmation Java / JDBC / Oracle

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Création d objet imbriqué sous PowerShell.

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Flux de données Lecture/Ecriture Fichiers

4 Exemples de problèmes MapReduce incrémentaux

Formation Cloudera Data Analyst Utiliser Pig, Hive et Impala avec Hadoop

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

NoSQL. Introduction 1/30. I NoSQL : Not Only SQL, ce n est pas du relationnel, et le contexte. I table d associations - Map - de couples (clef,valeur)

Développement Logiciel

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Le Modèle de Sécurité dans JAVA

MEDIAplus elearning. version 6.6

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Déploiement d une architecture Hadoop pour analyse de flux. françois-xavier.andreu@renater.fr

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Transcription:

Hadoop / Big Data Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS 2015-2016

11 MongoDB et map/reduce

MongoDB: fonction mapreduce 11-1 Au delà des points d'intégration Hadoop qui vont être abordés par la suite, MongoDB possède également une fonction mapreduce() interne. Elle est relativement limitée (essentiellement par le type de traitement qu'on peut effectuer sur les données), mais peut avoir son utilité. Sa syntaxe est la suivante: db.collection.mapreduce(fonction_map, FONCTION_REDUCE, {query:{conditions}, out: "NOM_SORTIE"})

MongoDB: fonction mapreduce 11-2 Imaginons qu'on ait par exemple une collection «orders»; contenant les documents suivants: (source: documentation mongodb)

MongoDB: fonction mapreduce 11-3 On va exécuter la commande suivante: (source: documentation mongodb) afin d'appliquer un traitement map/reduce aux documents dont le champs «status» vaut «A»; on générera des couples (clef;valeur) contenant l'identifiant client et le total de la commande dans map, et on renverra la somme de tous les totaux obtenus après shuffle pour chaque clef distincte dans reduce.

MongoDB: fonction mapreduce 11-4 Le traitement et son résultat: (lui-même stocké dans un champs order_totals) (source: documentation mongodb)

11-5 MongoDB dispose d'un connecteur Hadoop. Ce connecteur vise à permettre à des programmes map/reduce Hadoop de directement adresser MongoDB comme source des données d'entrée du programme ou comme destination des données de sorties. Ce connecteur est lui-aussi Open Source (licence AGPLv3). Il n'est en revanche pas inclus par défaut dans la distribution de MongoDB. URL du repository du projet: https://github.com/mongodb/mongo-hadoop (un sous-dépôt du dépôt principal github MongoDB)

11-6 Ce connecteur est disponible au sein d'une librairie Java.jar, et téléchargeable depuis le dépôt Github. Il a par ailleurs pour dépendance la librairie fournissant l'api Java de connexion à MongoDB (la même que celle qui a été utilisée lors du TP4). Le connecteur fonctionne en mettant à disposition du développeur des formats Hadoop supplémentaires d'entrée et de sortie, permettant de directement lire et écrire au sein de bases/collections MongoDB plutôt que depuis/sur HDFS. L'inclusion de la librairie (et de sa dépendance) sera donc nécessaire au sein du projet Java map/reduce si on souhaite s'en servir.

11-7 La librairie propose par ailleurs un helper: une classe, MongoTool, dont on va hériter dans la classe principale (la classe driver) du programme Hadoop afin de simplifier la configuration du programme et la spécification des points d'entrée et de sortie MongoDB. La librairie recommande par ailleurs d'utiliser un wrapper Hadoop standard au sein du main du programme pour le lancer, et de réduire ce main à une ligne unique qui se charge de lancer le programme en instanciant un objet de la classe Driver. En conséquence, c'est dans le constructeur de la classe driver qu'on va effectuer les opérations usuellement effectuées dans la fonction main: configuration Hadoop, spécification des points d'entrée et de sortie, etc.

qui se charge de lancer le programme via une instanciation de la classe driver, en s'occupant d'une partie des opérations automatiquement (par exemple la lecture des arguments Hadoop). 11-8 Une classe driver modèle aura donc une définition similaire à celle-ci: public class Driver extends MongoTool Et le main de cette classe aura le modèle suivant: public static void main(string[] args) throws Exception { System.exit(ToolRunner.run(new Driver(), args)); }

11-9 C'est dans le constructeur qu'on va spécifier les diverses options de configuration. En général, on commencera d'abord par créer un objet Configuration (comme cela a été le cas jusqu'ici): Configuration conf=new Configuration(); qui sera utilisé pour plusieurs opérations par la suite. Ensuite, on utilisera une seconde classe du connecteur pour spécifier toutes les options. Cette classe est MongoConfigUtil. Elle est statique (elle n'a donc pas besoin d'être instanciée).

11-10 La classe MongoConfigUtil propose la plupart des méthodes offertes d'ordinaire par la classe Job désignant le programme map/reduce, mais avec des noms plus simples (par exemple, setmapperclass devient setmapper). D'une manière générale, toutes les méthodes de configuration appelées prennent en premier argument l'objet Configuration créé précédemment. Une fois que la configuration est terminée, par ailleurs, on appellera la méthode: setconf(objet_configuration) de la classe mère. Cette méthode se chargera d'appliquer la configuration après modifications.

11-11 Les différentes méthodes suivantes sont applicables à la classe d: setmapper() pour définir la classe Mapper. setreducer() pour définir la classe Reducer. setoutputkey() pour définir le type de clef en sortie du programme. setoutputvalue() pour définir le type de valeur en sortie du programme. setmapperoutputkey() - définir le type de clef en sortie de Map.

11-12 setmapperoutputvalue() pour définir le type de clef en sortie de Reduce. setinputformat() pour définir le type de format d'entrée du programme. Ce type constitue une classe héritant de la classe Hadoop FileInputFormat, et indique à Hadoop la classe en charge de charger les données d'entrée (une possibilité jusqu'ici non utilisée, y compris dans les Tps). Par exemple, par défaut et si on ne spécifie pas de type explicite, alors le type utilisé est TextInputFormat, qui est la classe de chargement par défaut que nous avons utilisé jusqu'ici. Pour lire les données directement depuis MongoDB, on utilisera à la place la classe MongoInputFormat.

11-13 setoutputformat() pour définir le type de format de sortie du programme. Même remarque que pour setinputformat (mais avec TextOutputFormat la classe par défaut utilisée jusqu'ici). Toutes les fonctions précédentes ont des pendants dans l'api Hadoop. Il en existe par ailleurs d'autres (se référer à la documentation). On utilisera par ailleurs possiblement les fonctions suivantes (qui n'ont pas d'équivalent direct dans l'api Hadoop): setinputuri() pour spécifier l'url source des données sur MongoDB (uniquement si on souhaite lire les données depuis MongoDB).

11-14 setoutputuri() pour spécifier l'url destination des données de sortie sur MongoDB (uniquement si on souhaite écrire les données finale vers MongoDB). setquery() pour spécifier, sous la forme d'une string, un document BSON décrivant les critères de sélection à appliquer sur la collection des données sources (uniquement si on souhaite lire les données sources depuis MongoDB). Son format est identique à celui de la fonction find() de MongoDB (par exemple "{nom: 'John'}").

11-15 Les URLs MongoDB devront respecter le format suivant: mongodb://[user:pass@]host[:port]/db.collection Exemples: mongodb://localhost/hadoop.anagrammes mongodb://localhost:23000/hadoop.anagrammes mongodb://bob:secret@10.0.0.1/hadoop.anagrammes

Toutes deux sont présentes dans la librairie Java MongoDB. 11-16 Le connecteur va par ailleurs nous permettre, si on lit/écrit via MongoDB plutôt que HDFS, de passer des objets contenant directement les données BSON dans les classes map et/ou reduce, à la place des types Hadoop standards comme IntWritable ou Text. Cependant, le connecteur utilise encore partiellement l'ancienne API MongoDB; et on ne pourra donc pas utiliser le type Document vu jusq'ici dans l'api. A la place, on devra utiliser le type BSONObject (très similaire); et une seconde classe permettant facilement de générer un objet de ce type appelée BasicDBObjectBuilder.

11-17 Pour construire un document BSON au sein d'un objet BSONObject avec BasicDBObjectBuilder, on utilisera par exemple la syntaxe suivante: BSONObject doc=basicdbobjectbuilder.start().add('prenom', 'John').add('nom', 'Smith').get(); Comme pour la classe Document et ses méthodes append(), on peut imbriquer ici des documents (BSONObject), des tableaux, etc. et construire un BSON aussi complexe que nécessaire. Comme la classe Document, BSONObject propose par ailleurs une méthode get() permettant de récupérer la valeur d'un champs du document.

11-18 Ainsi, on pourrait par exemple spécifier dans le constructeur: Configuration conf = new Configuration(); MongoConfigUtil.setOutputFormat(conf, MongoOutputFormat.class); MongoConfigUtil.setInputFormat(conf, MongoInputFormat.class); MongoConfigUtil.setMapperOutputKey(conf, Text.class); MongoConfigUtil.setMapperOutputValue(conf, Text.class); MongoConfigUtil.setOutputKey(conf, ObjectId.class); MongoConfigUtil.setOutputValue(conf, BSONObject.class); setconf(conf);

11-19 ce qui indique qu'on souhaite lire et écrire via MongoDB, et que notre type de valeur finale sera un objet BSON (BSONObject). On indique que notre type de clef finale sera de type ObjectId. Cet aspect est important: en effet, lors de l'écriture vers MongoDB, le connecteur prendra la clef et l'attribuera au champs MongoDB "_id"; et il prendra la valeur et l'intégrera au document à la suite. Le fait qu'on souhaite lire depuis MongoDB implique par ailleurs la même chose, dans le sens inverse: nos couples (clef;valeur) d'entrée auront pour type de clef un ObjectId, et pour type de valeur un document BSONObject (lui-même contenant également l'objectid du document).

11-20 Par conséquent, la classe Mapper aura une définition du type: public class Map extends Mapper<ObjectId, BSONObject,...,...> Et la classe Reducer aura une définition du type: public class Reduce extends Reducer<...,..., ObjectId, BSONObject>

11-21 Il s'agit là à minima des seules modifications nécessaires pour lire/écrire depuis/vers MongoDB au sein d'un programme map/reduce Hadoop. Le connecteur possède de nombreuses autres options. Par exemple, il permet de définir diverses options relatives à la tâche map/reduce par le biais de fonctions identiques ou proches à celles qu'on applique d'ordinaire sur l'objet Job d'une tâche map/reduce. Pour plus de détails, se référer à la documentation.

- Exemple 11-22 Le programme de détection des anagrammes, version lecture/écriture MongoDB. Classe driver: package org.mbds.hadoop.mongo; import org.apache.hadoop.conf.configuration;... import org.bson.bsonobject; public class MongoAnagrammes extends MongoTool { public MongoAnagrammes() { Configuration conf = new Configuration(); MongoConfigUtil.setOutputFormat(conf, MongoOutputFormat.class);

- Exemple 11-23 MongoConfigUtil.setInputFormat(conf, MongoInputFormat.class); MongoConfigUtil.setInputURI(conf, "mongodb://localhost/hadoop.commonwords" ); MongoConfigUtil.setQuery(conf, "{}"); MongoConfigUtil.setOutputURI(conf, "mongodb://localhost/hadoop.anagrammes" ); MongoConfigUtil.setMapper(conf, MongoAnagrammesMap.class); MongoConfigUtil.setReducer(conf, MongoAnagrammesReduce.class); MongoConfigUtil.setMapperOutputKey(conf, Text.class); MongoConfigUtil.setMapperOutputValue(conf, Text.class); MongoConfigUtil.setOutputKey(conf, ObjectId.class); MongoConfigUtil.setOutputValue(conf, BSONObject.class); setconf(conf); }

- Exemple 11-24 public static void main(string[] args) throws Exception { System.exit(ToolRunner.run(new MongoAnagrammes(), args)); } }

- Exemple 11-25 Classe map: package org.mbds.hadoop.mongo; import org.bson.bsonobject; public class MongoAnagrammesMap extends Mapper<Object, BSONObject, Text, Text> { protected void map(object key, BSONObject value, Context context) throws IOException, InterruptedException { String val=(string)value.get("word"); char[] letters=val.tolowercase().tochararray(); Arrays.sort(letters); context.write(new Text(new String(letters)), new Text(val)); } }

- Exemple 11-26 Classe reduce: package emsimbds; import org.apache.hadoop.io.text;... public class MongoAnagrammesReduce extends Reducer<Text, Text, ObjectId, BSONObject> { public void reduce(text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { Iterator<Text> i=values.iterator(); ArrayList<String> anaglist=new ArrayList<String>(); while(i.hasnext()) // Pour chaque valeur... anaglist.add(i.next().tostring());

- Exemple 11-27 } } String[] anag=anaglist.toarray(new String[anaglist.size()]); BSONObject doc=basicdbobjectbuilder.start().add("letters", key.tostring()).add("anagrammes", anag).get(); context.write(new ObjectId(), doc);

- Exemple 11-28 Si, dans l'exemple précédent, la collection hadoop.commonwords contient par exemple les documents suivants: { "_id" : ObjectId("5657e09...63fa7a4"), "word" : "acrimonious" } { "_id" : ObjectId("5657e09...63fa7a5"), "word" : "aerodyne" } { "_id" : ObjectId("5657e09...63fa7a6"), "word" : "acariasis" } { "_id" : ObjectId("5657e09...63fa7a7"), "word" : "actually" } { "_id" : ObjectId("5657e09...63fa7a8"), "word" : "abomasum" } { "_id" : ObjectId("5657e09...63fa7a9"), "word" : "achene" } { "_id" : ObjectId("5657e09...63fa7aa"), "word" : "abscess" } { "_id" : ObjectId("5657e09...63fa7ab"), "word" : "adorn" } { "_id" : ObjectId("5657e09...63fa7ac"), "word" : "acentric" } { "_id" : ObjectId("5657e09...63fa7ad"), "word" : "absentee" } { "_id" : ObjectId("5657e09...63fa7ae"), "word" : "afterheat" }...

- Exemple 11-29 Alors à l'issue de l'exécution, une nouvelle collection hadoop.anagrammes sera créée qui contiendra: { "_id" : ObjectId("56...8d"), "letters" : "aaabcehinrt", "anagrammes" : [ "abranchiate" ] } { "_id" : ObjectId("56...8e"), "letters" : "aaabdelpt", "anagrammes" : [ "adaptable" ] } { "_id" : ObjectId("56...69"), "letters" : "elmno", "anagrammes" : [ "melon", "lemon" ] } { "_id" : ObjectId("56...8f"), "letters" : "aaabdfr", "anagrammes" : [ "abfarad" ] } { "_id" : ObjectId("56...90"), "letters" : "aaabdn", "anagrammes" : [ "abadan" ] } { "_id" : ObjectId("56...53"), "letters" : "aekl", "anagrammes" : [ "leak", "lake" ] }...

- Exécution 11-30 Pour exécuter le programme, on aura besoin de spécifier à Hadoop les deux librairies à charger en plus pour que les classes relatives au connecteur soient chargées correctement: La librairie du connecteur (mongo-hadoop-core.jar). Sa dépendance, l'api mongodb (mongo-java-driver.jar). On spécifiera l'emplacement de ces librairies par le biais de l'option additionnelle -libjars de la commande «hadoop jar», en les séparant par des virgules. Ces librairies doivent non seulement exister sur le système de fichier local mais également sur HDFS, au même emplacement; cela permet à tous les nœuds du cluster d'y avoir accès.

- Exécution 11-31 Ainsi, on exécutera par exemple: hadoop jar programme.jar org.mbds.programme -libjars /opt/mongo-hadoop-core.jar,/opt/mongo-javadriver.jar Selon la version de Hadoop, il peut également être nécessaire de définir une variable d'environnement HADOOP_CLASSPATH sur la machine locale qui pointe également sur ces deux librairies, mais cette fois séparée par un symbole «:» (comme un classpath Java classique).