Inovia Blog

L’actualité des technologies innovantes

Big data - L’analyse de données avec Pig

Par Kadda SAHNINE

Publié le | 5 décembre 2012 |

Apache PigLe paradigme MapReduce est fondamentalement adapté pour paralléliser des traitements sur un volume important de données, ce qui a valut à Hadoop le succès que l’on sait. Mais il atteint ses limites dès qu’il s’agit d’implémenter des traitements plus complexes que le simple comptage de mots dans un corpus de textes, fussent-ils volumineux.
L’écriture de fonctions Map/Reduce peut s’avérer être une opération très fastidieuse, et même répétitive puisque certains traitements comme les filtres sont très courants dès qu’il s’agit d’analyser des données. Mais surtout, il faut reconnaître que cette tâche n’est pas à la portée du premier consultant en analyse décisionnelle…

Hive et Pig à la rescousse

Les projets Hive et Pig, tous deux placés sous la bannière de la fondation Apache, apportent un modèle de développement de plus haut niveau, et donc beaucoup plus expressif et simple à appréhender, afin de démocratiser l’écriture de traitements MapReduce.
Hive propose un modèle de programmation dérivé du langage SQL.
Pig se rapproche plus d’un ETL où l’on part d’un ou plusieurs flux de données que l’on transforme étape par étape jusqu’à atteindre le résultat souhaité. Les différentes étapes de la transformation sont exprimés dans un langage procédural (Pig Latin).

Hive aura la faveur de quiconque est familier du langage SQL, mais nous pensons que Pig est plus adapté à l’univers de l’informatique décisionnelle où dominent les représentations orientées flux de données (voir SAS par exemple) couplées à un processus d’élaboration par étape.
Comparée à Hive, la courbe d’apprentissage est certes plus importante mais l’effort en vaut la peine.
C’est précisément ce que nous tâcherons de démontrer dans cet article à travers l’analyse de données météorologiques avec Pig.

Mise en oeuvre et utilisation de Pig

Le mode opératoire d’installation est des plus classiques. Il n’est pas nécessaire de disposer d’une cellule Hadoop pour découvrir Pig.
Il est possible d’utiliser Pig à travers son shell interactif (grunt). Pour cela, il suffit de lancer la commande suivante :

_PIG_DIR_/bin/pig -x local

En phase de développement, un programme Pig est écrit dans un fichier d’extension .pig et exécuté localement comme suit :

_PIG_DIR_/bin/pig -x local mon_prog.pig

Si, comme moi, vous êtes familier du développement sous l’éditeur Vim, vous pouvez installer ce package pour la coloration syntaxique.

Les exemples

Nous utiliserons deux jeux de données issus de Météo France.
L’ensemble des données et exemples de code sont accessibles sur GitHub.

Le premier fichier de données utilisé (meteo.csv) contient les relevés météorologiques des stations au format CSV :

indicatif OMM;date;temperature;temps present;direction du vent;force du vent;pression
07005;2012-11-13 18:00:00;101;10;120;41;102960
07005;2012-11-14 00:00:00;79;0;130;46;102950

L’indicatif OMM correspond à l’identifiant de station météorologique.

Le second fichier (stations.csv) contient l’ensemble des stations météorologiques en France métropolitaine, identifiées par l’indicatif OMM :

Id;Ville;indicatif OMM
1;Abbeville;7005
2;Lille-Lesquin;7015

Généralités

Les types de données

Pig supporte 2 familles de types de données :

  • les types scalaires : int, long, float, double, chararray, bytearray
  • les types complexes : map, tuples et bag
    • les map (tables associatives) : ex. ['devise'#'EUR', 'montant'#12000]
    • les tuples : ex. (1, 'Nancy')
    • les bag (liste non ordonnée de tuples) : ex {(1, 'Nancy'), (2, 'Reims')}

Les exemples de code n’ont qu’une valeur pédagogique. La question des optimisations des programmes Pig ne sera pas traitée dans cet article.

Charger les données

Conçu pour ingérer à peu près tout et n’importe quoi (d’où son nom), Pig n’impose aucune contrainte sur le format des données à traiter.
Néanmoins, il est très pratique d’indiquer au chargement la structure et le type des données, particulièrement lorsqu’elles sont au format CSV.
L’exemple ci-dessous charge l’indicatif OMM, la date du relevé, la température et la nature du temps :

donnees = load 'meteo.csv' using PigStorage(';')
            as (omm:int, date, temperature:int, temps:int);

On notera les points suivants :

  • utilisation de la clause using suivie du délimiteur de champ (PigStorage(';'))
  • Pig ignore la première ligne d’en-tête du fichier CSV au chargement
  • les fichiers de données sont automatiquement décompressés s’ils portent l’extension .bz2, .gz ou .lzo

La commande dump donnees permet d’afficher le contenu du flux de données dans la sortie standard.

En mode local, les fichiers de données doivent être localisés dans le même répertoire que le répertoire d’exécution du programme Pig.
En mode distribué, les fichiers de données doivent d’abord être déposés sur le système de fichiers distribué HDFS.
Si vous disposez d’un environnement Hadoop distribué ou pseudo-distribué, les fichiers peuvent être copiés via les commandes suivantes :

hadoop fs -mkdir /Data
hadoop fs -put ./meteo.csv /Data/

Les opérateurs relationnels

Les opérateurs relationnels permettent d’effectuer des opérations sur les données, comme filtrer, réorganiser, regrouper, trier ou effectuer des jointures.
Passons en revue les principaux opérateurs.

Filtrer les données

A titre d’exemple, filtrons le flux de données pour ne retenir que les relevés dans la ville de Reims dont indicatif OMM est 7072 en utilisant la fonction filter by.

reims = filter donnees by omm == 7072;
dump reims;

Filtrons encore davantage en ne retenant que les relevés effectués à midi précise via une expression régulière (clause matches) :

reims = filter donnees by omm == 7072 and date matches '.* 12:00:00';
dump reims;

L’expression foreach / generate

L’utilisation de l’expression foreach / generate permet de réaliser une projection, c’est-à-dire un réarrangement du flux de données.
L’exemple ci-dessous réarrange le flux de données en ne retenant que les 3 premières colonnes :

donnees_temp = foreach donnees generate pmm, date, temperature;

Regrouper les données

L’opérateur group (n’ayant aucun rapport avec l’opérateur SQL GROUP BY) permet de regrouper des enregistrements partageant une donnée en commun, les mettant ainsi en relation.
Par exemple, si vous examinez le relevé de température, vous observerez que les enregistrements peuvent être regroupés par station météo (indicatif OMM).
L’opération de regroupement par indicatif OMM part d’abord d’un flux d’origine, à savoir une séquence de tuples constitués de l’indicatif OMM, de la date du relevé et de la température :

(7690, 2012-11-14 12:00:00, 19)
(7761, 2012-11-15 12:00:00, 16)
(7690, 2012-11-16 12:00:00, 16)

L’opération de regroupement par indicatif OMM produit une séquence de couples (clé, bag), dont la clé est l’indicatif OMM et le bag une liste d’enregistrements partageant le même indicatif OMM, ce qui donne :

(7690, {(7690, 2012-11-14 12:00:00, 19), (7690, 2012-11-16 12:00:00, 16)})
(7761, {(7761, 2012-11-15 12:00:00, 16)})

En langage Pig Latin, ce traitement s’implémente tout simplement comme suit :

donnees_par_omm = group donnees by omm;

Trier les données

L’instruction order / by permet d’opérer un tri de manière assez similaire à son équivalent SQL.

tri_par_station = order donnees by omm;

On oriente le sens du tri par ajout de asc ou desc respectivement dans le sens croissant ou décroissant.

Les jointures

L’opérateur join est évidemment incontournable dans l’analyse décisionnelle dans la mesure où la profondeur de l’analyse réside dans le croisement des informations.
Essayons de sortir la liste des 5 villes les plus froides de France le 15 Novembre 2012 à midi.
Pour ce faire, nous utiliserons deux sources de données. La première contient l’ensemble des relevés météorologiques, la seconde contient la liste des stations référencées en France métropolitaine.

donnees = load 'meteo.csv' using PigStorage(';') as (omm:int, date, temperature:int);
 stations = load 'stations.csv' using PigStorage(';') as (id:int, ville, omm:int);

On filtre le relevé sur la date du 15 Novembre à midi et on effectue une jointure sur la liste des stations en croisant par indicatif OMM :

releve_12h = filter donnees by date matches '2012-11-15 12:00:00';
       jnt = join releve_12h by omm, stations by omm;

Enfin :

  • on trie le résultat de la jointure par ordre croissant de température
  • on se limite aux 5 premiers enregistrements
  • on affiche le libellé des 5 villes les plus froides de France
tri_releve = order jnt by temperature asc;
     les_5 = limit tri_releve 5;
    villes = foreach les_5 generate ville;
dump villes;

A l’exécution, on obtient le résultat suivant :

(Nancy-Ochey)
(Caen-Carpiquet)
(Troyes-Barberey)
(Rouen-Boos)
(Reims-Prunay)

Les UDFs

Les UDFs (User Defined Fonctions) sont un ensemble de fonctions implémentant un traitement précis allant du calcul mathématique à la transformation de données. Les fonctions Pig comme COUNT, AVG, MAX, MIN sont en fait des UDFs déjà embarqués dans Pig. Vous pouvez étendre les fonctions de bases en développant vos propres UDFs en Java mais également en Python depuis la version 0.8.

Calculer une moyenne : la fonction AVG

A titre d’exemple, calculons la température moyenne à midi à Reims (indicatif OMM 7072) à partir de l’échantillon de données.

  donnees = load 'meteo.csv' using PigStorage(';') as (omm:int, date, temperature:int);
    reims = filter donnees by omm == 7072 and date matches '.* 12:00:00';
grp_reims = group reims by omm;
 temp_moy = foreach grp_reims generate AVG(reims.temperature)/10;
dump temp_moy;

Piggybank

Piggybank est une collection d’UDFs packagés sous la forme d’un JAR, fournissant tout un ensemble de fonctions prêtes à l’emploi.
Il est par exemple très simple d’effectuer une analyse de trafic d’un site web en Pig à partir des access logs au format CLF, grâce au chargeur de logs fourni par Piggybank.

Abonnez vous !
  • RSS
  • Yahoo
  • Netvibes

Suivez l'auteur sur Twitter !
  • Suivre sur Twitter

A propos de l'auteur

Kadda SAHNINE
Architecte technique Java EE
#JavaEE #Linux #vim addict #OpenSoftware #OpenHardware
Voir le profil de Kadda Sahnine sur LinkedIn

Flux RSS

Rechercher

Administration