Upload
lilia-sfaxi
View
1.095
Download
2
Embed Size (px)
DESCRIPTION
Pour accéder aux fichiers nécessaires pour faire ce TP, visitez: https://drive.google.com/folderview?id=0Bz7DokLRQvx7M2JWZEt1VHdwSE0&usp=sharing Pour plus de contenu, Visitez http://liliasfaxi.wix.com/liliasfaxi !
Citation preview
Institut National des Sciences Appliquées et de Technologie Tunisie
Big Data
2013-2014
TP4- MAP-REDUCE AVEC
CASSANDRA Dr. Lilia SFAXI – Mme Wahiba Ben Fraj
Objectifs du TP : Utiliser Cassandra comme source de données et
destination des jobs Map Reduce.
TP4 : Map-Reduce avec Cassandra
Page 2
I. API pycassa Pycassa est un client Python pour manipuler la base de données Cassandra.
Le module à intégrer dans python est récupéré à l'adresse suivante:
https://pypi.python.org/packages/source/p/pycassa/pycassa-1.11.0.tar.gz
(Vous pourrez le retrouver sur notre Drive partagé, répertoire Download/TP4).
I.1. Installer pycassa Pour installer le module pycassa, comme tout autre module de Python sur une
machine Linux, suivre les étapes suivantes:
- Décompresser l'archive dans le répertoire de votre choix
- Avec l'invite de commande, déplacez-vous vers ce répertoire, vous
devriez y trouver un fichier setup.py
- Taper:
sudo python setup.py install
Une fois le module installé, l'instruction suivante ne devrait plus lancer
d'exception si on l'exécute avec python:
import pycassa
I.2. Utilisation de pycassa Nous allons montrer dans ce qui suit les différentes instructions dont nous
aurons besoin pour manipuler la base Cassandra avec python. Pour plus
d'informations, consulter la documentation de pycassa, disponible en ligne à
l'adresse:
http://pycassa.github.io/pycassa/index.html
I.2.1. Connexion à Cassandra Pour se connecter à un keyspace KS en localhost, utiliser les instructions
suivantes:
pool = pycassa.ConnectionPool(keyspace='KS', server_list=['127.0.0.1:9160'])
Pour appeler une table (column family) cf1, utiliser:
TP4 : Map-Reduce avec Cassandra
Page 3
cf = pycassa.ColumnFamily(pool, 'cf1')
I.2.2. Ecriture des données Pour insérer les colonnes associées à la clef key1 dans une table cf1, utiliser:
cf1.insert(key1', {'col1': 'val1', 'col2': 'val2'})
I.2.3. Lecture des données Pour extraire des données à partir de la table cf1, utiliser:
data = cf1.get(key1,columns=['col1','col2']);
Cela va extraire les valeurs des colonnes col1 et col2 associées à la clef key1,
et les stocker dans data, qui est de type orderedDict. orderedDict est une liste
de couples (clef,valeur) ordonnées.
Ainsi, dans notre variable data, les champs seront ordonnés comme suit:
{'col1': 'val1', 'col2': 'val2'}
Pour extraire le premier couple, utiliser:
data.items()[0]
Pour extraire la première valeur (val1), utiliser:
data.items()[0][1]
I.2.4. Nombre d'entrées Pour connaitre le nombre d'entrées (lignes) dans une table cf1, utiliser:
len(list(cf1.get_range()
I.3. Objectifs du TP Dans ce TP, le but est de réaliser le fameux exemple wordcount de Hadoop,
en extrayant les données à partir de cassandra, au lieu de les lire à partir d'un
fichier brut.
Pour cela, nous allons:
1. Créer la base de données avec Cassandra
2. Remplir la base de données
TP4 : Map-Reduce avec Cassandra
Page 4
3. Écrire le code du mapper permettant d'extraire l'ensemble des mots se
trouvant dans la base.
4. Écrire le code du reducer permettant de compter les mots extraits, et
de les stocker dans la base.
II. Réalisation II.1. Création de la base de données et des tables Créer un keyspace Cassandra appelé wordcount, contenant deux tables:
- Une table input_words contenant un champs id (entier, clef primaire) et
un champs line(texte)
- Une table output_words contenant un champs word (texte, clef
primaire) et un champs nb_iter (entier)
Pour que pycassa puisse accéder aux données des tables, ces dernières
doivent être créées avec la mention “WITH COMPACT STORAGE“ insérée à la
fin de l'instruction de création.
II.2. Remplissage de la table input_words Pour remplir la table input_words avec des lignes de texte, nous avons choisi
d'utiliser comme source le texte d'une bible, trouvé ici:
https://sites.google.com/site/ruwach/bibletext . Il est également disponible sur
le drive partagé.
- Créer un répertoire tp4 à l'emplacement de votre choix. C'est dans ce
répertoire que nous allons mettre tous les fichiers nécessaires à notre
travail.
- Extraire l'archive donnée dans le répertoire tp4. Renommez le répertoire
obtenu vers bible.
- Ecrire un fichier populate.py, permettant d'utiliser l'API pycassa pour
stocker dans la table input_words les lignes lues à partir de l'entrée
standard. Chaque ligne sera stockée en entier dans le champs line,
avec comme identifiant un entier incrémental.
TP4 : Map-Reduce avec Cassandra
Page 5
- Pour exécuter le fichier populate.py et lui donner comme entrée le
contenu du répertoire bible, utiliser l'instruction suivante:
find bible -type f -name "*.txt" -print0 | xargs -0 cat | sed "s/^[0-9 ]*//" | python populate.py
- Vérifier que votre table contient bien le texte. Pour cela, taper:
select * from input_words where id = 20;
Et vérifier que le résultat est bien le suivant:
II.3. Mapper Écrire un Mapper mapper.py permettant de lire les données à partir de la
table input_words, d'extraire les mots de chaque ligne en enlevant la
ponctuation, et d'afficher sur la sortie standard chaque mot suivi du nombre 1.
Astuce: Pour extraire les différents mots (sans ponctuation) d'une phrase,
exécuter le code suivant:
import re; mots = re.findall("[\w]+",phrase)
II.4. Reducer Écrire un Reducer reducer.py permettant de lire à partir de l'entrée standard
un couple mot/valeur ordonné par le mot, et de compter le nombre
d'itérations d'un même mot. Le résultat (mot, nombre d'iterations) sera stocké
dans la table output_words.
Exécuter le job Map/Reduce sur votre système local, en tapant sur votre
terminal:
python mapper.py | sort | python reducer.py
Consulter la table output_words, et trouver le nombre de fois où le mot: holy a
été appelé dans l'ancien testament.
TP4 : Map-Reduce avec Cassandra
Page 6
III. Homework III.1. Partie 1 Pour pouvoir consulter les données à partir d'une base de données NOSQL au
lieu d'un fichier texte et les exécuter sur Hadoop, Cassandra offre une
implémentation de la classe InputFormat.java, utilisée par le mapper de
Hadoop pour extraire les données.
Montrer dans un exemple simple comment exécuter un job Map-Reduce en
Java sur Hadoop, en utilisant comme source de données une table dans
Cassandra.
III.2. Partie 2 Essayez d'exécuter les Jobs Map-Reduce que vous avez réalisé en TP sur
Hadoop. Que constatez-vous? Comment faire pour que l'exécution se fasse
proprement?