Mooc Fun Big Data Semaine 9 Hadoop
Mooc Fun Big Data Semaine 9 Hadoop
Mooc Fun Big Data Semaine 9 Hadoop
Cours 2
● Hadoop est:
● Indéfiniment scalable.
solutions.
● Caractéristiques:
● Distribué
● Redondé
$$ hadoop
hadoop fs
fs -put
-put data.txt
data.txt /input/files/data.txt
/input/files/data.txt
$$ hadoop
hadoop fs
fs -get
-get /input/files/data.txt
/input/files/data.txt data.txt
data.txt
$$ hadoop
hadoop fs
fs -mkdir
-mkdir /output
/output
$$ hadoop
hadoop fs
fs -rm
-rm /input/files/data.txt
/input/files/data.txt
…… etc
etc ……
Remarques
1-9
● Deux options:
http://www.cloudera.com/content/cloudera/en/downloads/cd
h.html
Installation manuelle
3-4
● Pré-requis:
export
export JAVA_HOME=/path/to/java/jdk
JAVA_HOME=/path/to/java/jdk
/opt/hadoop/etc/hadoop/hdfs-site.xml
Installation manuelle – Configuration
3-12
http://mooc.tokidev.fr/hadoop_vm_2014.ova
● On déclarera une classe Mapper par exemple ainsi (ici pour l'exemple
du compteur d'occurences de mots):
public
public class
class WCountMap
WCountMap extends
extends Mapper<Object,
Mapper<Object, Text,
Text, Text,
Text, IntWritable>
IntWritable>
//
// Permet
Permet àà Hadoop
Hadoop de
de lire
lire ses
ses arguments
arguments génériques,
génériques,
//
// récupère
récupère les
les arguments
arguments restants
restants dans
dans ourArgs.
ourArgs.
String[]
String[] ourArgs=new
ourArgs=new GenericOptionsParser(conf,
GenericOptionsParser(conf,
args).getRemainingArgs();
args).getRemainingArgs();
//
// Obtient
Obtient un
un nouvel
nouvel objet
objet Job:
Job: une
une tâche
tâche Hadoop.
Hadoop. On
On
//
// fourni
fourni la
la configuration
configuration Hadoop
Hadoop ainsi
ainsi qu'une
qu'une description
description
//
// textuelle
textuelle de
de la
la tâche.
tâche.
Job
Job job=Job.getInstance(conf,
job=Job.getInstance(conf, "Compteur
"Compteur de
de mots
mots v1.0");
v1.0");
Exemple – Occurences de mots
4-15
//
// Défini
Défini les
les classes
classes driver,
driver, map
map et
et reduce.
reduce.
job.setJarByClass(WCount.class);
job.setJarByClass(WCount.class);
job.setMapperClass(WCountMap.class);
job.setMapperClass(WCountMap.class);
job.setReducerClass(WCountReduce.class);
job.setReducerClass(WCountReduce.class);
//
// Défini
Défini types
types clefs/valeurs
clefs/valeurs de
de notre
notre programme
programme Hadoop.
Hadoop.
job.setOutputKeyClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class);
//
// Défini
Défini les
les fichiers
fichiers d'entrée
d'entrée du
du programme
programme et
et le
le
//
// répertoire
répertoire des
des résultats.
résultats. On
On se
se sert
sert du
du premier
premier et
et du
du
//
// deuxième
deuxième argument
argument restants
restants pour
pour permettre
permettre àà
//
// l'utilisateur
l'utilisateur de
de les
les spécifier
spécifier lors
lors de
de l'exécution.
l'exécution.
FileInputFormat.addInputPath(job,
FileInputFormat.addInputPath(job, newnew Path(ourArgs[0]));
Path(ourArgs[0]));
FileOutputFormat.setOutputPath(job,
FileOutputFormat.setOutputPath(job, new new Path(ourArgs[1]));
Path(ourArgs[1]));
Exemple – Occurences de mots
4-16
//
// On
On lance
lance la
la tâche
tâche Hadoop.
Hadoop. Si
Si elle
elle s'est
s'est effectuée
effectuée
//
// correctement,
correctement, on
on renvoie
renvoie 0.
0. Sinon,
Sinon, on
on renvoie
renvoie -1.
-1.
if(job.waitForCompletion(true))
if(job.waitForCompletion(true))
System.exit(0);
System.exit(0);
System.exit(-1);
System.exit(-1);
}}
Exemple – Occurences de mots
4-17
private
private static
static final
final IntWritable
IntWritable ONE=new
ONE=new IntWritable(1);
IntWritable(1);
//
// La
La fonction
fonction MAP
MAP elle-même.
elle-même.
protected
protected void
void map(Object
map(Object offset,
offset, Text
Text value,
value, Context
Context context)
context)
throws IOException, InterruptedException
throws IOException, InterruptedException
{{
//
// Un
Un StringTokenizer
StringTokenizer va
va nous
nous permettre
permettre de
de parcourir
parcourir chacun
chacun des
des
//
// mots
mots de
de la
la ligne
ligne qui
qui est
est passée
passée àà notre
notre opération
opération MAP.
MAP.
StringTokenizer
StringTokenizer tok=new
tok=new StringTokenizer(value.toString(),
StringTokenizer(value.toString(), "" ");
");
while(tok.hasMoreTokens())
while(tok.hasMoreTokens())
{{
Text
Text word=new
word=new Text(tok.nextToken());
Text(tok.nextToken());
//
// On
On renvoie
renvoie notre
notre couple
couple (clef;valeur):
(clef;valeur): le
le mot
mot courant
courant suivi
suivi
//
// de
de la
la valeur
valeur 11 (définie
(définie dans
dans la
la constante
constante ONE).
ONE).
context.write(word,
context.write(word, ONE);
ONE);
}}
}}
Exemple – Occurences de mots
4-18
//
// La
La fonction
fonction REDUCE
REDUCE elle-même.
elle-même. LesLes arguments:
arguments: lala clef
clef key,
key, un
un
//
// Iterable de toutes les valeurs qui sont associées à la clef en
Iterable de toutes les valeurs qui sont associées à la clef en
//
// question,
question, etet le
le contexte
contexte Hadoop
Hadoop (un
(un handle
handle qui
qui nous
nous permet
permet de
de
// renvoyer le résultat à Hadoop).
// renvoyer le résultat à Hadoop).
public
public void
void reduce(Text
reduce(Text key,
key, Iterable<IntWritable>
Iterable<IntWritable> values,
values,
Context
Context context)
context)
throws
throws IOException,
IOException, InterruptedException
InterruptedException
{{
//
// Pour
Pour parcourir
parcourir toutes
toutes les
les valeurs
valeurs associées
associées àà la
la clef
clef fournie.
fournie.
Iterator<IntWritable>
Iterator<IntWritable> i=values.iterator();
i=values.iterator();
int
int count=0;
count=0; //// Notre
Notre total
total pour
pour lele mot
mot concerné.
concerné.
while(i.hasNext())
while(i.hasNext()) //
// Pour
Pour chaque
chaque valeur...
valeur...
count+=i.next().get();
count+=i.next().get(); //
// ...on
...on l'ajoute
l'ajoute au
au total.
total.
//
// On
On renvoie
renvoie le
le couple
couple (clef;valeur)
(clef;valeur) constitué
constitué de
de notre
notre clef
clef key
key
//
// et
et du
du total,
total, au
au format
format Text.
Text.
context.write(key,
context.write(key, newnew Text(count+"
Text(count+" occurences."));
occurences."));
}}
}}
5 Hadoop: utilisation (2)
Exemple 2 – Anagrammes / Driver
5-1
//
// Le
Le main
main du
du programme.
programme.
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws Exception
Exception
{{
//
// Créé
Créé un
un object
object de
de configuration
configuration Hadoop.
Hadoop.
Configuration
Configuration conf=new
conf=new Configuration();
Configuration();
//
// Permet
Permet àà Hadoop
Hadoop de
de lire
lire ses
ses arguments
arguments génériques,
génériques,
//
// récupère
récupère les
les arguments
arguments restants
restants dans
dans ourArgs.
ourArgs.
String[]
String[] ourArgs=new
ourArgs=new GenericOptionsParser(conf,
GenericOptionsParser(conf,
args).getRemainingArgs();
args).getRemainingArgs();
//
// Obtient
Obtient un
un nouvel
nouvel objet
objet Job:
Job: une
une tâche
tâche Hadoop.
Hadoop. On
On
//
// fourni
fourni la
la configuration
configuration Hadoop
Hadoop ainsi
ainsi qu'une
qu'une description
description
//
// textuelle
textuelle de
de la
la tâche.
tâche.
Job
Job job=Job.getInstance(conf,
job=Job.getInstance(conf, "Anagrammes
"Anagrammes v1.0");
v1.0");
Exemple 2 – Anagrammes / Driver
5-2
job.setJarByClass(Anagrammes.class);
job.setJarByClass(Anagrammes.class);
job.setMapperClass(AnagrammesMap.class);
job.setMapperClass(AnagrammesMap.class);
job.setReducerClass(AnagrammesReduce.class);
job.setReducerClass(AnagrammesReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setOutputValueClass(Text.class);
//
// Défini
Défini les
les fichiers
fichiers d'entrée
d'entrée du
du programme
programme et
et le
le
//
// répertoire
répertoire des
des résultats,
résultats, depuis
depuis la
la ligne
ligne de
de commande.
commande.
FileInputFormat.addInputPath(job,
FileInputFormat.addInputPath(job, newnew Path(ourArgs[0]));
Path(ourArgs[0]));
FileOutputFormat.setOutputPath(job,
FileOutputFormat.setOutputPath(job, newnew Path(ourArgs[1]));
Path(ourArgs[1]));
//
// On
On lance
lance la
la tâche
tâche Hadoop.
Hadoop. Si
Si elle
elle s'est
s'est effectuée
effectuée
//
// correctement,
correctement, on
on renvoie
renvoie 0.
0. Sinon,
Sinon, on
on renvoie
renvoie -1.
-1.
if(job.waitForCompletion(true))
if(job.waitForCompletion(true))
System.exit(0);
System.exit(0);
System.exit(-1);
System.exit(-1);
}}
Exemple 2 – Anagrammes / Mapper
5-3
//
// Classe
Classe MAP
MAP
public
public class
class AnagrammesMap
AnagrammesMap extends
extends Mapper<Object,
Mapper<Object, Text,
Text, Text,
Text, Text>
Text>
{{
//
// La
La fonction
fonction MAP
MAP elle-même.
elle-même.
protected
protected void map(Object key,
void map(Object key, Text
Text value,
value, Context
Context context)
context) throws
throws
IOException,
IOException, InterruptedException
InterruptedException
{{
//
// Ordonne
Ordonne les
les lettres
lettres de
de la
la valeur
valeur d'entrée
d'entrée par
par ordre
ordre alphabétique.
alphabétique.
//
// Il
Il s'agira
s'agira de
de la
la clef
clef de
de sortie.
sortie.
char[]
char[] letters=value.toString().toLowerCase().toCharArray();
letters=value.toString().toLowerCase().toCharArray();
Arrays.sort(letters);
Arrays.sort(letters);
//
// On
On renvoie
renvoie le
le couple
couple (clef;valeur),
(clef;valeur), en
en convertissant
convertissant la
la clef
clef
//au
//au type
type Hadoop
Hadoop (Text).
(Text).
context.write(new
context.write(new Text(new
Text(new String(letters)),
String(letters)), value);
value);
}}
}}
Exemple 2 – Anagrammes / Reducer
5-4
//
// La
La classe
classe REDUCE.
REDUCE.
public
public class
class AnagrammesReduce
AnagrammesReduce extends
extends Reducer<Text,
Reducer<Text, Text,
Text, Text,
Text, Text>
Text>
{{
public
public void
void reduce(Text
reduce(Text key,
key, Iterable<Text>
Iterable<Text> values,
values, Context
Context context)
context) throws
throws
IOException, InterruptedException
IOException, InterruptedException
{{
//
// Pour
Pour parcourir
parcourir toutes
toutes les
les valeurs
valeurs associées
associées àà la
la clef
clef fournie.
fournie.
Iterator<Text>
Iterator<Text> i=values.iterator();
i=values.iterator();
String
String result="";
result="";
Boolean
Boolean first=true;
first=true;
while(i.hasNext())
while(i.hasNext()) //
// Pour
Pour chaque
chaque valeur...
valeur...
{{
if(first)
if(first) //
// Premier
Premier mot,
mot, donc
donc on
on n'inclut
n'inclut pas
pas le
le symbole
symbole "|".
"|".
{{
//
// Notre
Notre chaîne
chaîne de
de résultat
résultat contient
contient initialement
initialement
//
// le
le premier
premier mot.
mot.
result=i.next().toString();
result=i.next().toString();
first=false;
first=false;
}}
Exemple 2 – Anagrammes / Reducer
5-5
//
// Pas
Pas le
le premier:
premier: on
on concatene
concatene le
le mot
mot àà la
la chaîne
chaîne de
de resultat.
resultat.
else
else
result=result+"
result=result+" || "+i.next().toString();
"+i.next().toString();
}}
//
// On
On renvoie
renvoie le
le couple
couple (clef;valeur)
(clef;valeur) constitué
constitué de
de
// notre clef key et de la chaîne concaténée.
// notre clef key et de la chaîne concaténée.
context.write(key,
context.write(key, new
new Text(result));
Text(result));
}}
}}
Compilation
5-6
Par exemple:
hadoop
hadoop jar
jar wcount_unice.jar
wcount_unice.jar org.unice.hadoop.wordcount.WCount
org.unice.hadoop.wordcount.WCount \\
/input/poeme.txt
/input/poeme.txt /results
/results
Résultats
5-8
● Hadoop stocke les résultats dans une série de fichiers dont le nom
respecte le format:
part-r-XXXX
Par exemple:
hadoop
hadoop jar
jar wcount_unice.jar
wcount_unice.jar org.unice.hadoop.wordcount.WCount
org.unice.hadoop.wordcount.WCount \\
/input/poeme.txt
/input/poeme.txt /results
/results
6 Autres langages; autres outils Hadoop
Autres langages de programmation
6-1
● Synopsis:
hadoop
hadoop jar
jar hadoop-streaming-X.Y.Z.jar
hadoop-streaming-X.Y.Z.jar -input
-input [HDFS
[HDFS INPUT
INPUT FILES]
FILES] \\
-output
-output [HDFS
[HDFS OUTPUT
OUTPUT FILES]
FILES] \\
-mapper
-mapper [MAP
[MAP PROGRAM]
PROGRAM] \\
-reducer
-reducer [REDUCE
[REDUCE PROGRAM]
PROGRAM]
● Par exemple:
hadoop
hadoop jar
jar hadoop-streaming-X.Y.Z.jar
hadoop-streaming-X.Y.Z.jar -input
-input /poeme.txt
/poeme.txt \\
-output
-output /results
/results -mapper
-mapper ./map.py
./map.py -reducer
-reducer ./reduce.py
./reduce.py
Format des données
6-3
● Opération map:
import
import sys
sys
## Pour
Pour chaque
chaque ligne
ligne d'entrée.
d'entrée.
for line in sys.stdin:
for line in sys.stdin:
## Supprimer
Supprimer les
les espaces
espaces autour
autour de
de la
la ligne.
ligne.
line=line.strip()
line=line.strip()
## Pour
Pour chaque
chaque mot
mot de
de la
la ligne.
ligne.
words=line.split()
words=line.split()
for
for word
word in
in words:
words:
## Renvoyer
Renvoyer couple
couple clef;valeur:
clef;valeur: le
le mot
mot comme
comme clef,
clef, l'entier
l'entier "1"
"1" comme
comme
## valeur.
valeur.
## On
On renvoie
renvoie chaque
chaque couple
couple sur
sur une
une ligne,
ligne, avec
avec une
une tabulation
tabulation entre
entre
## la
la clef
clef et
et la
la valeur.
valeur.
print
print "%s\t%d"
"%s\t%d" %% (word,
(word, 1)
1)
Exemple – Occurences de mot, Python
6-5
● Opération reduce:
import
import sys
sys
total=0;
total=0; ## Notre
Notre total
total pour
pour le
le mot
mot courant.
courant.
## Contient le dernier mot rencontré.
Contient le dernier mot rencontré.
lastword=None
lastword=None
## Pour
Pour chaque
chaque ligne
ligne d'entrée.
d'entrée.
for
for line
line in
in sys.stdin:
sys.stdin:
## Supprimer
Supprimer les
les espaces
espaces autour
autour de
de la
la ligne.
ligne.
line=line.strip()
line=line.strip()
## Récupérer
Récupérer la
la clef
clef et
et la
la valeur,
valeur, convertir
convertir la
la valeur
valeur en
en int.
int.
word,
word, count=line.split('\t',
count=line.split('\t', 1)
1)
count=int(count)
count=int(count)
Exemple – Occurences de mot, Python
6-6
total=total+count
total=total+count ## Ajouter
Ajouter la
la valeur
valeur au
au total
total
## Ecrire
Ecrire le
le dernier
dernier couple
couple (clef;valeur).
(clef;valeur).
print
print "%s\t%d
"%s\t%d occurences"
occurences" %% (lastword,
(lastword, total)
total)
Exemple – Occurences de mot, Bash
6-7
● Opération map:
## Pour
Pour chaque
chaque ligne
ligne d'entrée.
d'entrée.
while
while read
read line;
line; do
do
## Supprimer
Supprimer les
les espaces
espaces autour
autour de
de la
la ligne.
ligne.
line=$(echo
line=$(echo "$line"|sed
"$line"|sed 's/^\s*\(.\+\)\s*$/\1/')
's/^\s*\(.\+\)\s*$/\1/')
## Pour
Pour chaque
chaque mot
mot de
de la
la ligne.
ligne.
for word in $line;
for word in $line; do do
## Renvoyer
Renvoyer couple
couple clef;valeur:
clef;valeur: le
le mot
mot comme
comme clef,
clef, l'entier
l'entier "1"
"1" comme
comme
## valeur.
valeur.
## On
On renvoie
renvoie chaque
chaque couple
couple sur
sur une
une ligne,
ligne, avec
avec une
une tabulation
tabulation entre
entre
## la clef et la valeur.
la clef et la valeur.
echo
echo -e
-e $word"\t"1
$word"\t"1
done
done
done
done
Exemple – Occurences de mot, Bash
6-8
● Opération reduce:
lastword=""
lastword=""
total=0
total=0
## Pour
Pour chaque
chaque ligne
ligne d'entrée.
d'entrée.
while read line;
while read line; dodo
## Supprimer
Supprimer les
les espaces
espaces autour
autour de
de la
la ligne.
ligne.
line=$(echo "$line"|sed 's/^\s*\(.\+\)\s*$/\1/')
line=$(echo "$line"|sed 's/^\s*\(.\+\)\s*$/\1/')
## Recuperer
Recuperer mot
mot et
et occurrence
occurrence (IE,
(IE, clef
clef et
et valeur)
valeur)
word=$(echo
word=$(echo "$line"|awk
"$line"|awk -F
-F "\t"
"\t" '{print
'{print $1}');
$1}');
nb=$(echo "$line"|awk -F "\t" '{print $2}');
nb=$(echo "$line"|awk -F "\t" '{print $2}');
Exemple – Occurences de mot, Bash
6-9
total=$[
total=$[ $total
$total ++ $nb
$nb ]] ## Ajouter
Ajouter la
la valeur
valeur au
au total.
total.
done
done
## Ecrire
Ecrire le
le dernier
dernier couple
couple (clef;valeur).
(clef;valeur).
echo
echo -e
-e $lastword"\t"$total"
$lastword"\t"$total" occurences."
occurences."
Autres outils associés à Hadoop
6-10
… et beaucoup d'autres …
Conclusion
6-11