6
Institut National des Sciences Appliquées et de Technologie Tunisie Big Data 2013-2014 TP4- M AP -R EDUCE AVEC C ASSANDRA Dr. Lilia SFAXI – Mme Wahiba Ben Fraj Objectifs du TP : Utiliser Cassandra comme source de données et destination des jobs Map Reduce.

BigData_TP4 : Map-Reduce avec Cassandra

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

Page 1: BigData_TP4 : Map-Reduce avec Cassandra

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.

Page 2: BigData_TP4 : Map-Reduce avec Cassandra

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:

Page 3: BigData_TP4 : Map-Reduce avec Cassandra

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

Page 4: BigData_TP4 : Map-Reduce avec Cassandra

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.

Page 5: BigData_TP4 : Map-Reduce avec Cassandra

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.

Page 6: BigData_TP4 : Map-Reduce avec Cassandra

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?