7 Développement d une application de MapReduce



Documents pareils
Notes de cours Practical BigData

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

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

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

Introduction à Hadoop & MapReduce

Introduc)on à Map- Reduce. Vincent Leroy

Certificat Big Data - Master MAthématiques

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

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

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

Corrigé des exercices sur les références

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

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

Introduction à MapReduce/Hadoop et Spark

Java Licence Professionnelle CISII,

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmer en JAVA. par Tama

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Bases Java - Eclipse / Netbeans

Chapitre 10. Les interfaces Comparable et Comparator 1

Remote Method Invocation Les classes implémentant Serializable

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Corrigés des premiers exercices sur les classes

TP1 : Initiation à Java et Eclipse

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Auto-évaluation Programmation en Java

Programmation par les Objets en Java

ACTIVITÉ DE PROGRAMMATION

Classe Interne, Anonyme & Enumération

Synchro et Threads Java TM

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

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

RMI le langage Java XII-1 JMF

Traitement de données

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

as Architecture des Systèmes d Information

Premiers Pas en Programmation Objet : les Classes et les Objets

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

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

Flux de données Lecture/Ecriture Fichiers

Initiation à JAVA et à la programmation objet.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Le Modèle de Sécurité dans JAVA

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

Programmation Par Objets

Tutoriel d installation de Hibernate avec Eclipse

Plan du cours. Historique du langage Nouveautés de Java 7

Web Tier : déploiement de servlets

Cours 1: Java et les objets

Un ordonnanceur stupide

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Java Licence Professionnelle CISII,

Environnements de développement (intégrés)

Calcul Parallèle. Cours 5 - JAVA RMI

Big Data Concepts et mise en oeuvre de Hadoop

OpenPaaS Le réseau social d'entreprise

Package Java.util Classe générique

Votre premier projet Android

INITIATION AU LANGAGE JAVA

Projet de programmation (IK3) : TP n 1 Correction

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

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

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

Utiliser Java sans BlueJ

Desktop Intégration. Rémi Forax

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

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

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

LOG4430 : Architecture logicielle et conception avancée

Objets et Programmation. origine des langages orientés-objet

Java Licence professionnelle CISII,

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

Cartographie des solutions BigData

Avant-propos. Organisation du livre

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Exercices sur les interfaces

Implémentation parallèle de certains algorithmes de fouille de données avec le framework MapReduce

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Environnements de développement (intégrés)

Remote Method Invocation (RMI)

Threads. Threads. USTL routier 1

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Tp 1 correction. Structures de données (IF2)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Création d une application JEE

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

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

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

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

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

Projet Java EE Approfondi

Transcription:

7 Développement d une application de MapReduce Ecrire un programme d Hadoop demande un processus : écrire une fonction map, une fonction reduce et tester localement. Ecrire ensuite un programme pour lancer un job sur une bases de données de petite taille, fixer les erreurs s il y en a. Une fois que le programme marche parfaitement sur les données petites, on peut le mettre sur un cluster. Debugger un programme raté est un chalenge. Ensuite, quand le programme marche sur les données complètes, on fait des tunings. 7.1 API de configuration 7.1.1 Configuration d une ressource Les composantes d Hadoop sont configurées dans son propre API de configuration. Une instance de la classe Configuration représente une collection des propriétés de configuration et leurs valeurs. Chaque propriété est nommée par un String, et le type peut être boolean, int, long, float, String, Class, java.io.file ou d autres collections de String. Voici un example <?xml version="1.0"?> <name>color</name> <value>yellow</value> <description>color</description> <name>size</name> <value>10</value> <description>size</description> <name>weight</name> <value>heavy</value> <final>true</final> <description>weight</description> <name>size-weight</name> <value>${size,${weight</value> <description>size and weight</description> Il est possible d intervenir dans le fichier configuration-1.xml ci-dessus par une pièce de code Java. Configuration conf = new Configuration(); conf.addresource("configuration-1.xml"); assertthat(conf.get("color"), is("yellow")); assertthat(conf.getint("size", 0), is(10)); assertthat(conf.get("breadth", "wide"), is("wide")); Remarquons que le type d une propriété n est pas stocké dans le fichier xml. 21

7.1.2 Combinaison de ressources Si l on a un deuxième fichier de configuration configuration-2.xml, on pourra combiner en codant : Configuration conf = new Configuration(); conf.addresource("configuration-1.xml"); conf.addresource("configuration-2.xml"); avec <?xml version="1.0"?> <name>size</name> <value>12</value> <name>weight</name> <value>light</value> Règle : Les propriétés sont définies comme dans la ressource qui sont ajoutée en dernier, sauf celles qui sont marquées final. 7.1.3 Expansion de variables Les propriétés peuvent être définies en terme des propriétés de système. Par exemple, la propriété size-weight dans le premier fichier de configuration est définie comme $s{size, $s{weight puis ces propriétés sont épandu en utilisant la valeur dans la configuration 2. Les propriétés de système prend la priorité sur celles définies dans les fichiers de ressources. System.setProperty("size", "14"); assertthat(conf.get("size-weight"), is("14,heavy")); Notons que même si les propriétés de configuration peuvent être définies par la propriété de système, ils sont inaccessibles à la di érence des propriétés redéfinies en utilisant celles de configuration. 7.2 Configuration de l environnement de développement Dans ce cours, on utilise Eclipse comme l IDE de développement. On crée un nouveau projet de Java avec Eclipse et ajoute tous les fichiers JAR du niveau top de la distribution et du dossier lib au classpath. On pourra ensuite compiler Java Hadoop et le fonctionner en mode locale. 7.2.1 Gestion de Configuration Il est nécessaire au cours de développement de basculer entre le mode local et en cluster. Une manière d accommoder ces variations est d avoir des fichiers de configuration d Hadoop. On peut utiliser trois fichiers correspondant aux modes divers. Les noms de fichiers ne sont pas spéciaux, on peut les remplacer par les autres noms à notre choix. Le fichier hadoop-local.xml : Configuration par défaut, utilisant le mode local. 22

<?xml version="1.0"?> <name>fs.default.name</name> <value>file:///</value> <name>mapred.job.tracker</name> <value>local</value> Le fichier hadoop-localhost.xml : Les configurations pointent à un namenode et un jobtracker exécutant en localhost. <?xml version="1.0"?> <name>fs.default.name</name> <value>hdfs://localhost/</value> <name>mapred.job.tracker</name> <value>localhost:8021</value> Le fichier hadoop-cluster.xml contient les détails sur les namenode de clusters et les adresses de jobtracker. <?xml version="1.0"?> <name>fs.default.name</name> <value>hdfs://namenode/</value> <name>mapred.job.tracker</name> <value>jobtracker:8021</value> On pourra lancer en choisissant un mode, par exemple : % hadoop fs -conf hadoop-localhost.xml -ls L écran a che quelque chose de similaire à : Found 12 items -rw-r--r-- 1 riduan91 staff 6148 2015-01-21 14:44.DS_Store -rw-r--r-- 1 riduan91 staff 958 2015-01-16 10:37.classpath -rw-r--r-- 1 riduan91 staff 366 2015-01-16 07:23.project drwxr-xr-x - riduan91 staff 340 2015-01-21 22:14 bin -rw-r--r-- 1 riduan91 staff 255 2015-01-21 18:14 hadoop-local.xml -rw-r--r-- 1 riduan91 staff 272 2015-01-21 18:15 hadoop-localhost.xml drwxr-xr-x - riduan91 staff 136 2015-01-21 14:58 output drwxr-xr-x - riduan91 staff 136 2015-01-19 10:59 output1 23

drwxr-xr-x - riduan91 staff 238 2015-01-21 22:14 src -rw-r--r-- 1 riduan91 staff 95 2015-01-16 08:33 weather.txt drwxr-xr-x - riduan91 staff 204 2015-01-21 14:44 weather_result -rw-r--r-- 1 riduan91 staff 39 2015-01-21 15:05 weather_result.txt 7.2.2 GenericOptionsParser, Tool et ToolRunner GenericOptionsParser est une classe qui interprète les options command-line commune d Hadoop, puis les installe sur un objet de type Configuration. Il est convénient d implémenter l interface Tool et exécuter l application avec ToolRunner. On remarque que l interface Tool est de structure suivante : public interface Tool extends Configurable { int run(string [] args) throws Exception; Voici un exemple qui a che les propriétés d une Configuration. import java.util.map.entry; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.conf.configured; import org.apache.hadoop.util.tool; import org.apache.hadoop.util.toolrunner; public class ConfigurationPrinter extends Configured implements Tool { static { Configuration.addDefaultResource("hdfs-default.xml"); Configuration.addDefaultResource("hdfs-site.xml"); Configuration.addDefaultResource("mapred-default.xml"); Configuration.addDefaultResource("mapred-site.xml"); @Override public int run(string[] args) throws Exception { Configuration conf = getconf(); for (Entry<String, String> entry: conf) { System.out.printf("%s=%s\n", entry.getkey(), entry.getvalue()); return 0; public static void main(string[] args) throws Exception { int exitcode = ToolRunner.run(new ConfigurationPrinter(), args); System.exit(exitCode); Le bloc statique garantit que les configurations de HFDS et MapReduce sont ajoutés dans Configuration en outre que le tronc (core). Il est possible de trouver la valeur d une propriété en appelant : % export HADOOP_CLASSPATH=bin % hadoop ConfigurationPrinter -conf hadoop-localhost.xml grep mapred.job.tracker= 24

qui a chera mapred.job.tracker=localhost:8021 7.3 Ecrire des tests local par MRUnit 7.3.1 Préparation Il est essentiel de suivre les étapes suivants pour lancer MRUnit en Eclipse si l on utilise Hadoop 2.6.0. 1. Télécharger la version recommandée de MRUnit d Apache. Pour Hadoop 2.6.0, on utilise mrunit-1.1.0-hadoop2.jar et le met dans Buildpath d Eclipse. (https://repository.apache. org/content/repositories/releases/org/apache/mrunit/mrunit/) 2. Chercher la version correspondante pour Mosquito, i.e, 1.9.5 pour Hadoop 2.6.0 (https://code. google.com/p/mockito/downloads/list ), le met dans Buildpath d Eclipse. 3. Créer un projet Maven dans Eclipse et modifier le fichier pom.xml en ajoutant : <dependency> <groupid>org.apache.mrunit</groupid> <artifactid>mrunit</artifactid> <version>1.1.0</version> <classifier>hadoop2</classifier> </dependency> 4. Vérifier que la partie Dependencies a forme : Figure 6 Dependences de MRUnit pour Hadoop2 5. Mettre les fichiers jar nécessaires en Buildpath (Figure 7). On peut les trouver dans hadoop-2.6.0/source/hadoop/. 7.3.2 Map Test La classe MaxTemperatureMapper import java.io.ioexception; 25

Figure 7 Buildpath pour le projet test import org.apache.hadoop.io.longwritable; import org.apache.hadoop.mapreduce.mapper; public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override public void map(longwritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.tostring(); String year = line.substring(0, 4); String temp = ""; if (line.charat(4)== + ) temp = line.substring(5, 9); else temp = line.substring(4, 9); if (!missing(temp)) { int airtemperature = Integer.parseInt(temp); context.write(new Text(year), new IntWritable(airTemperature)); private boolean missing(string temp) { return temp.equals("+9999"); La classe test MaxTemperatureMapperTest import java.io.ioexception; import org.apache.hadoop.io.longwritable; import org.apache.hadoop.mrunit.mapreduce.mapdriver; import org.junit.*; 26

public class MaxTemperatureMapperTest { @Test public void processesvalidrecord() throws IOException, InterruptedException { Text value = new Text("1951+12349_"); new MapDriver<LongWritable, Text, Text, IntWritable>().withMapper(new MaxTemperatureMapper()).withInput(new LongWritable(),value).withOutput(new Text("1951"), new IntWritable(1234)).runTest(); 7.3.3 Reduce Test La classe MaxTemperatureReducer import java.io.ioexception; import org.apache.hadoop.mapreduce.reducer; public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int maxvalue = Integer.MIN_VALUE; for (IntWritable value : values) { maxvalue = Math.max(maxValue, value.get()); context.write(key, new IntWritable(maxValue)); La classe test MaxTemperatureReducerTest import java.io.ioexception; import java.util.arrays; import org.apache.hadoop.mrunit.mapreduce.reducedriver; public class MaxTemperatureReducerTest { public void returnsmaximumintegerinvalues() throws IOException, InterruptedException { new ReduceDriver<Text, IntWritable, Text, IntWritable>().withReducer(new MaxTemperatureReducer()) 27

.withinput(new Text("1950"), Arrays.asList(new IntWritable(10), new IntWritable(5))).withOutput(new Text("1950"), new IntWritable(10)).runTest(); 7.4 Exécution locale sur les données test 7.4.1 Installation de Maven 1. Télécharger un fichier tar.gz sur le site http://maven.apache.org/download.cgi, l extraire dans un dossier, par exemple /user/apache-maven-3.2.5 2. Ecrire dans le fichier.bash profile : export M2_HOME=/user/apache-maven-3.2.5 export M2=$M2_HOME/bin export PATH=$M2:$PATH 3. Vérifier avec la commande : % mvn --version L écran devrait a cher quelque chose de similaire à : Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T18:29:23+01:00) Maven home: /user/apache-maven-3.2.5 Java version: 1.6.0_65, vendor: Apple Inc. Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Default locale: en_us, platform encoding: MacRoman OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac" 7.4.2 Lancer un Job dans Local Job Runner L application pour MaxTemperature import org.apache.hadoop.conf.configured; import org.apache.hadoop.fs.path; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.util.tool; import org.apache.hadoop.util.toolrunner; public class MaxTemperatureDriver extends Configured implements Tool { public int run(string[] args) throws Exception { if (args.length!= 2) { System.err.printf("Usage: %s [generic options] <input> <output>\n", getclass().getsimplename()); ToolRunner.printGenericCommandUsage(System.err); return -1; Job job = Job.getInstance(); 28

job.setjarbyclass(getclass()); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.setmapperclass(maxtemperaturemapper.class); job.setcombinerclass(maxtemperaturereducer.class); job.setreducerclass(maxtemperaturereducer.class); job.setoutputkeyclass(text.class); job.setoutputvalueclass(intwritable.class); return job.waitforcompletion(true)? 0 : 1; public static void main(string[] args) throws Exception { int exitcode = ToolRunner.run(new MaxTemperatureDriver(), args); System.exit(exitCode); Pour lancer le programme, on peut utliser MVN : % mvn compile % export HADOOP_CLASSPATH=target/classes/ % hadoop MaxTemperatureDriver -conf conf/hadoop-local.xml weather.txt output ou bien en Hadoop % hadoop v2.maxtemperaturedriver -fs file:/// -jt local input/ncdc/micro output 29