Navigation

Versions

23/11/2015 : création

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 23 November 2015

Hadoop, aide mémoire, les bases

Introduction

Hadoop est un ensemble d'outils permettant notamment de lancer des map reduce sur des clusteurs géants (plusieurs milliers de machines). Hadoop gère tous les problèmes de pannes matérielles, répartition des traitements sur les noeuds,...

HDFS (Hadoop Distributed File System) est la brique de base de Hadoop. C'est un système de fichier distribué.

Map/Reduce est une technique pour paralléliser des traitements sur un cluster. Ca n'est pas spécifique à Hadoop (on peut lancer des map/reduce dans mongoDb par exemple).

Cette page recense quelques commandes usuelles autour de Hadoop / HDFS et Map Reduce.

Installer Hadoop et map reduce

Le moyen le plus simple d'installer hadoop est docker. Je vous propose un docker qui installe une instance simple d'hadoop sur votre poste.

https://github.com/kibatic/docker-single-node-hadoop

Je vous laisse suivre le readme pour installer votre instance.

HDFS, Hadoop Distributed File System

Commandes de base de HDFS

# Créer un répertoire dans hdfs
hdfs dfs -mkdir /mon_repertoire

# lire le contenu d'un répertoire
hdfs dfs -ls /mon_repertoire

# envoyer plusieurs fichiers dans /mon_repertoire
hdfs dfs -put my_files*.txt /mon_repertoire

# récupérer un fichier dans hdfs
hdfs dfs -get /mon_repertoire/output/part-00000 ma_sortie.txt

# effacer un ou plusieurs fichiers
hdfs dfs -rm /mon_repertoire/my_files*

# lire le contenu d'un fichier
hdfs dfs -cat /mon_repertoire/my_file1.txt

Map Reduce

Principe (en très rapide)

2 étapes :

  • le mapper qui transforme les données d'entrée en clé/valeur et peut commencer des traitements, tant que ces traitements peuvent s'appliquer en parallèle sans avoir accès à l'ensemble des données
  • le reducer prend les sorties des mappers, classées par clé (classement fait par hadoop) et fait les traitements qui vont bien pour sortir le résultat attendu.

Un exemple

On veut compter le nombre d'occurences de chaque mot du "Discours sur la paix" de Prévert :

fichier.txt

Vers la fin d’un discours
extrêmement important
le grand homme d’État, trébuchant
sur une belle phrase creuse
tombe dedans
et désemparé, la bouche grande ouverte,
haletant, montre les dents
et la carie dentaire
de ses pacifiques raisonnements
met à vif le nerf de la guerre :
la délicate question d’argent.

Le mapper.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# module pour les io stdin stdout
import sys

# on sépare les mots, on utilise le mot comme clé et comme valeur, on met 1
for line in sys.stdin:
    # vire les retours à la ligne  
    line = line.strip()
    # coupe le texte séparé par des espaces
    keys = line.split()
    # pour chaque mot, écrit une ligne avec le mot un tab et le compte : 1
    for key in keys:   
        print('%s\t1' % (key) )

Le reducer.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ici, les clés en sortie du mapper ont été classées. Il n'y a plus qu'à
# sommer les décomptes, et écrire le décompte à chaque changement
# de clé.
import sys

last_key = False
running_total = 0

for input_line in sys.stdin:
    # parse la ligne d'entrée
    input_line = input_line.strip()
    this_key, value = input_line.split("\t", 1)
    value = int(value)
    
    # à chaque fois qu'on a la même clé, on incrémente le compteur
    if last_key == this_key:
        running_total += value

    # si on change de clé, il faut sortir la clé précédente avec le total
    else:
        if last_key != False:
            print( "{0}\t{1}".format(last_key, running_total) )
        running_total = value
        last_key = this_key

# écrire le total de la dernière ligne du fichier
print( "{0}\t{1}".format(last_key, running_total))

Debug d'un map reduce en python

Un map reduce lancé dans hadoop est très difficile à débugguer. Si le map reduce est codé dans python, on peut tester les scripts (sur des sources de données petites).

# lancer un map_reduce python hors hadoop
cat fichier*.txt | ./mapper.py | sort | ./reducer.py

Lancer le map reduce dans hadoop

cd /example
# copier les fichiers d'entrée dans hdfs
hdfs dfs -mkdir /input
hdfs dfs -put ./fichier.txt /input

# lancer le map reduce
hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar \
    -input /input \
    -output /output \
    -mapper /example/mapper.py \
    -reducer /example/reducer.py

Conclusion

Ce tuto s'est concentré sur une mise en place pratique en développement et les commandes de base.

N'hésitez pas à nous faire vos retours dans les commentaires.

Commentaires

Ajouter un commentaire
Objectif du tuto
Le but du tuto est une première mise en place rapide pour commencer à jouer avec Hadoop. En gros quand j'ai écrit ce tuto, j'avais trouvé 50 trucs qui expliquaient le principes, 30 trucs qui expliquaient la mise en place complète en cluster. Il me manquait le petit truc basique qui me permettait de jouer rapidement avec Hadoop pour tester moi même...

Du coup, j'ai partagé ici cette mise en place rapide.
A ce niveau c'est plus du light c'est du % ... tuto completement inutile
Bonjour, 

je trouve un peu light votre tuto