7 D´eveloppement d’une application de MapReduce
Ecrire un programme d’Hadoop demande un processus : ´ecrire une fonction map, une fonction reduce et
tester localement. Ecrire ensuite un programme pour lancer un job sur une bases de donn´ees de petite taille,
fixer les erreurs s’il y en a. Une fois que le programme marche parfaitement sur les donn´ees ”petites”, on
peut le mettre sur un cluster. Debugger un programme rat´e est un chalenge. Ensuite, quand le programme
marche sur les donn´ees compl`etes, on fait des tunings.
7.1 API de configuration
7.1.1 Configuration d’une ressource
Les composantes d’Hadoop sont configur´ees dans son propre API de configuration. Une instance de la
classe Configuration repr´esente une collection des propri´et´es de configuration et leurs valeurs. Chaque
propri´et´e est nomm´ee par un String,etletypepeuetreboolean, int, long, float, String, Class,
java.io.File ou d’autres collections de String.
Voici un example
<?xml version="1.0"?>
<configuration>
<property>
<name>color</name>
<value>yellow</value>
<description>Color</description>
</property>
<property>
<name>size</name>
<value>10</value>
<description>Size</description>
</property>
<property>
<name>weight</name>
<value>heavy</value>
<final>true</final>
<description>Weight</description>
</property>
<property>
<name>size-weight</name>
<value>${size},${weight}</value>
<description>Size and weight</description>
</property>
</configuration>
Il est possible d’intervenir dans le fichier configuration-1.xml ci-dessus par une pi`ece 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´et´e n’est pas stock´e dans le fichier xml.
21
7.1.2 Combinaison de ressources
Si l’on a un deuxi`eme 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"?>
<configuration>
<property>
<name>size</name>
<value>12</value>
</property>
<property>
<name>weight</name>
<value>light</value>
</property>
</configuration>
R`egle : Les propri´et´es sont d´efinies comme dans la ressource qui sont ajout´ee en dernier, sauf celles qui
sont marqu´ees final.
7.1.3 Expansion de variables
Les propri´et´es peuvent ˆetre d´efinies en terme des propri´et´es de syst`eme. Par exemple, la propri´et´e
size-weight dans le premier fichier de configuration est d´efinie comme
$s{size}, $s{weight}
puis ces propri´et´es sont ´epandu en utilisant la valeur dans la configuration 2.
Les propri´et´es de syst`eme prend la priorit´e sur celles d´efinies dans les fichiers de ressources.
System.setProperty("size", "14");
assertThat(conf.get("size-weight"), is("14,heavy"));
Notons que mˆeme si les propri´et´es de configuration peuvent ˆetre d´efinies par la propri´et´e de syst`eme, ils
sont inaccessibles `a la di´erence des propri´et´es red´efinies en utilisant celles de configuration.
7.2 Configuration de l’environnement de d´eveloppement
Dans ce cours, on utilise Eclipse comme l’IDE de d´eveloppement. On cr´ee 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´ecessaire au cours de d´eveloppement de basculer entre le mode local et en cluster. Une mani`ere
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´eciaux, on peut les remplacer par les
autres noms `a notre choix.
Le fichier hadoop-local.xml : Configuration par d´efaut, utilisant le mode local.
22
<?xml version="1.0"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>file:///</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>local</value>
</property>
</configuration>
— Le fichier hadoop-localhost.xml : Les configurations pointent `a un namenode et un jobtracker
ex´ecutant en localhost.
<?xml version="1.0"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost/</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>
</configuration>
Le fichier hadoop-cluster.xml contient les d´etails sur les namenode de clusters et les adresses de
jobtracker.
<?xml version="1.0"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://namenode/</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>jobtracker:8021</value>
</property>
</configuration>
On pourra lancer en choisissant un mode, par exemple :
% hadoop fs -conf hadoop-localhost.xml -ls
L’´ecran ache quelque chose de similaire `a :
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`ete les options command-line commune d’Hadoop, puis
les installe sur un objet de type Configuration. Il est conv´enient d’impl´ementer l’interface Tool et ex´ecuter
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 ache les propri´et´es 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´es dans Configuration
en outre que le tronc (core).
Il est possible de trouver la valeur d’une propri´et´e en appelant :
% export HADOOP_CLASSPATH=bin
% hadoop ConfigurationPrinter -conf hadoop-localhost.xml | grep mapred.job.tracker=
24
qui achera
mapred.job.tracker=localhost:8021
7.3 Ecrire des tests local par MRUnit
7.3.1 Pr´eparation
Il est essentiel de suivre les ´etapes suivants pour lancer MRUnit en Eclipse si l’on utilise Hadoop 2.6.0.
1. el´echarger la version recommand´ee 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´eer 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. erifier que la partie ”Dependencies” a forme :
Figure 6 – Dependences de MRUnit pour Hadoop2
5. Mettre les fichiers jar n´ecessaires 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
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !