PIG

Transcription

PIG
L.A. Steffenel
INFO0939 - BigData
Cours 4 –Apache PIG
Objectifs
u
Etudier le langage de haut niveau PIG
u
Voir des exemples d'utilisation
u
Apprendre les notions de base
u
Développer et intégrer des UDFs
M2 Informatique
INFO0939
L.A. Steffenel
Présentation
u
u
Pig est un outil pour permettre le développement rapide de programmes mapreduce
u
Utilise langage de script Pig Latin – langage de haut niveau
u
Syntaxe proche du SQL
u
Génère des jobs map-reduce automatiquement
Pig n'est pas un langage complet comme Java ou Python
u
u
C'est un langage "data flow"
Indiqué pour
u
les opérations ETL (Extraction, Transformation, Lecture)
u
la manipulation et l'analyse de données brutes
u
L'exploration interactive des données (grâce à la CLI grunt)
M2 Informatique
INFO0939
L.A. Steffenel
Les bases de Pig
Fonctionnement et Syntaxe
u
Pig est une couche d'abstraction au dessus de Hadoop
u
Un script Pig Latin est converti en une ou plusieurs tâches map/reduce
u
Tout programme Pig est constitué a minima des étapes suivantes :
u
u
Chargement des données (LOAD)
u
Transformations/traitements sur les données
u
Sauvegarde des résultats (DUMP/STORE)
Ces trois étapes sont toutes parallélisées par le biais de tâches map/reduce
M2 Informatique
INFO0939
L.A. Steffenel
Syntaxe et Types
u
u
Chaque ligne d'un script PIG doit être terminée par un point-virgule ';'
u
Il est possible de commenter le code avec la syntaxe multi-lignes:
u
/* Ceci est un commentaire sur plusieurs lignes. */ (issue du C)
u
ou avec la syntaxe sur une ligne:
u
LOAD... -- Ceci est un commentaire sur une ligne. (issue de SQL)
Pig supporte les types de données usuels suivants :
u
int – un entier sur 32 bits
u
long – un entier sur 64 bits
u
float – un flottant sur 32 bits
u
double – un flottant sur 64 bits
u
chararray – une chaîne de caractères UTF-8
u
bytearray – une chaîne binaire
u
boolean – un booléen (true/false)
M2 Informatique
INFO0939
L.A. Steffenel
Types Complexes
u
Pig supporte également les trois types complexes suivants
u
tuple: une série de données.
u
u
bag: un ensemble de tuples
u
u
Par exemple : (12, John, 5.3)
Par exemple : {(12, John, 5.3), (8), (3.5, TRUE, Bob, 42)}
map: une série de couples (clé#valeur)
u
Par exemple: [qui#22, le#3] (ici avec deux couples clé#valeur)
u
Au sein d'un type map, chaque clé doit être unique
M2 Informatique
INFO0939
L.A. Steffenel
Composition des Types Complexes
u
Un tuple peut tout à fait contenir d'autres tuples, ou encore des bags, ou
autres types simples et complexes.
u
Par exemple:
u
({(1, 2), (3, John)}, 3, [qui#23])
u
Ce tuple contient trois membres:
u
Un bag contenant lui-même trois tuples
u
Un entier de valeur 3
u
Un map contenant un seul couple (clé#valeur)
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données
u
Les données d'entrée d'un programme pig seront typiquement chargées au
sein d'un bag
u
On utilise la commande LOAD pour charger des données depuis le système de
fichier (HDFS en mode mapreduce ou système de fichiers local en mode local)
u
Format :
u
LOAD 'source' [USING fonction] [AS schemas]
u
Source : le nom du/des fichier(s) ou répertoire(s) (wildcards acceptés)
u
Fonction : le nom d'une fonction d'importation
u
Schemas : un descriptif du format des données importées
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données
u
Le paramètre fonction permet d'indiquer la manière de charger/segmenter
les données d'une manière cohérente
u
u
Désigne une classe Java en charge d'interpréter les données depuis le système de
fichier et d'en sortir des types Pig cohérents (tuples / bag / map)
Pig offre une série de fonctions par défaut. La plus courante est la fonction
PigStorage :
u
PigStorage("SEPARATEUR")
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - PigStorage
u
u
PigStorage chargera les données textuelles d'entrée sous la forme d'un bag de
tuples, un pour chaque ligne des données
u
Le séparateur indique, pour chaque ligne, le caractère unique de séparation entre
les différents champs des membre de chaque tuple
u
Par défaut, le séparateur est la tabulation ([TAB], \t)
Pour un fichier d'entrée "etudiants.txt" suivant :
ADAM|Guillaume|15
BERCHANE|Rachid|18
BOULLAIRE|Alexandre|16
BOYER|Raphael|17
CHAMPOUSSIN|Luca|14
CODA|Stephen|15
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - PigStorage
u
Si on exécute la ligne:
A = LOAD 'etudiants.txt' USING PigStorage('|');
u
alors A contiendra le bag de tuples suivant :
(ADAM,Guillaume,15)
(BERCHANE,Rachid,18)
(BOULLAIRE,Alexandre,16)
(BOYER,Raphael,17)
(CHAMPOUSSIN,Luca,14)
(CODA,Stephen,15)
u
(avec trois champs texte, texte et entier par tuple)
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - PigStorage
u
Si en revanche, on utilise:
A = LOAD 'etudiants.txt' USING PigStorage(',');
u
alors A contiendra le bag de tuples suivant :
("ADAM|Guillaume|15")
("BERCHANE|Rachid|18")
("BOULLAIRE|Alexandre|16")
("BOYER|Raphael|17")
("CHAMPOUSSIN|Luca|14")
("CODA|Stephen|15")
u
(avec un seul et unique champs texte par tuple)
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données
u
u
D'autres fonctions « standard » sont mises à disposition par Pig, dont :
u
TextLoader: aucun paramètre, charge simplement chaque ligne de texte comme un
tuple avec un seul champs – la ligne elle-même
u
JsonLoader: permet de charger un fichier JSON de manière structurée. Un
argument, indiquant le format du JSON à charger
Il est également possible de développer sa propre fonction de chargement
(sous la forme d'une classe Java compilée en .jar)
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - Schémas
u
Par défaut, une fois le bag des données d'entrée chargé, on pourra se référer
aux différents membres de chaque tuple en utilisant la syntaxe : $0, $1, $2,
etc.
u
Par exemple, si on a chargé les données suivantes dans A:
(ADAM,Guillaume,15)
(BERCHANE,Rachid,18)
(BOULLAIRE,Alexandre,16)
u
L'expression A.$2 désignera la note (15, 18, ...)
u
L'expression A.$0 désignera le nom de famille (ADAM, ...)
M2 Informatique
INFO0939
L.A. Steffenel
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - Schémas
u
u
Le troisième argument optionnel de LOAD, schemas, permet de :
u
Donner un nom aux champs des tuples chargés
u
Leur attribuer un type de données explicite
u
Spécifier un type de chargement différent (autre qu'un simple bag de tuples)
La syntaxe:
(NOM1:TYPE1, NOM2:TYPE2,NOM3:TYPE3...)
u
Le type est optionnel
u
Par exemple :
A = LOAD 'in.txt' USING PigStorage('|') AS (nom, prenom, note);
u
Permet de se référer au champs A.$2 comme A.note
ADAM|Guillaume|15
BERCHANE|Rachid|18
BOULLAIRE|Alexandre|16
BOYER|Raphael|17
CHAMPOUSSIN|Luca|14
CODA|Stephen|15
Chargement de Données - Schémas
u
On pourrait également forcer le type de la note par le biais de:
A = LOAD 'in.txt' USING PigStorage('|') AS (nom, prenom, note:float);
u
Par contre
A = LOAD 'in.txt' USING PigStorage('|') AS (nom, prenom:int, note:float);
u
Aura le champs prénom vide car Pig tente de l'interpréter comme un type int
ADAM|Guillaume|15
BERCHANE|Rachid|18
BOULLAIRE|Alexandre|16
BOYER|Raphael|17
CHAMPOUSSIN|Luca|14
CODA|Stephen|15
M2 Informatique
INFO0939
L.A. Steffenel
Chargement de Données - Schémas
u
Pour un exemple plus complexe, soit :
u
Si on fait:
M2 Informatique
INFO0939
L.A. Steffenel
(ADAM,Guillaume)|(15,15,12)
(BERCHANE,Rachid)|(18,15,20)
(BOULLAIRE,Alexandre)|(16,11,18)
A = LOAD 'in.txt' Using PigStorage('|') AS
(infos:tuple(nom,prenom),notes:tuple(n1,n2,n3));
u
Alors les données obtenues auront la forme :
u
On pourra alors se référer à « A.infos.prenom »,
ou encore « A.notes.n1 », etc
u
u
((ADAM,Guillaume),(15,15,12))
((BERCHANE,Rachid),(18,15,20))
((BOULLAIRE,Alexandre),(16,11,18))
La fonction de chargement doit supporter ce type de schémas plus complexes
Il est recommandé de toujours définir explicitement un schéma de
chargement avec tous les types et noms définis
u
meilleure lisibilité
u
assurer la cohérence dans le type des données d'entrée
Commande DESCRIBE
u
On peut à tout moment obtenir (au sein du shell interactif) une description de
la composition d'un container par le biais de la commande DESCRIBE
u
Par exemple :
A = LOAD 'in.txt' Using PigStorage('|') AS
(infos:tuple(nom,prenom),notes:tuple(n1,n2,n3));
DESCRIBE A;
u
Donnera à l'écran :
A: {infos: (nom: bytearray,prenom: bytearray),notes: (n1: bytearray,n2:
bytearray,n3: bytearray)}
u
Très utile lors de la rédaction/test d'un programme Pig
M2 Informatique
INFO0939
L.A. Steffenel
Sauvegarde des Données - DUMP
u
u
Deux commandes principales existent pour extraire des données depuis Pig
u
DUMP
u
STORE
La première est la commande DUMP
DUMP <nom du container>;
u
Par exemple :
DUMP A;
u
Cette commande ne sauvegarde pas les données sur le système de fichier
mais juste les affiche à l'écran
u
Utilisé en mode interactif. Les sorties affichées plus haut (résultats de LOAD)
sont issues de la commande DUMP
M2 Informatique
INFO0939
L.A. Steffenel
Sauvegarde de Données - STORE
u
La seconde commande est STORE, qui enregistre less données sur le système
de fichier (HDFS ou local selon le mode)
STORE alias INTO 'repertoire' [USING fonction];
u
alias représente le container à sauvegarder (par exemple "A"
u
Comme les données sont issues d'une tâche map/reduce, elles seront stockées
sous la forme de plusieurs fichiers "part-r-*"
u
Le répertoire indique le répertoire dans lequel on souhaite que les fichiers
résultants de la tâche/du stockage soient écrits
M2 Informatique
INFO0939
L.A. Steffenel
Sauvegarde de Données - STORE
u
u
On peut spécifier une fonction indiquant la manière de formater les données
u
Les mêmes fonctions que celles vu précédemment sont utilisables (PigStorage,
JsonStorage, ... mais pas TextLoader)
u
La fonction est optionnelle (PigStorage('\t') par défaut)
STORE ne supporte pas de schéma ; à la place, si un schéma est nécessaire
(par exemple pour du json), c'est généralement le paramètre de la fonction
de stockage qui est utilisé
u
Dans le cas du JSON, Pig utilisera par défaut les noms de colonnes directement
issues du schéma de l'alias concerné
u
le schéma est stocké sous la forme d'un fichier .pig_schema dans le répertoire. Si
on recharge les données avec un JsonStorage, le schéma sera automatiquement
importé par la fonction
M2 Informatique
INFO0939
L.A. Steffenel
Sauvegarde de Données - Exemple
u
Pour un fichier d'entrée :
A = LOAD 'in.txt' USING PigStorage('|')
AS (nom:chararray, prenom:chararray, note:float);
u
u
ADAM|Guillaume|15
BERCHANE|Rachid|18
BOULLAIRE|Alexandre|16
BOYER|Raphael|17
DUMP A;
DESCRIBE A;
(ADAM,Guillaume,15)
(BERCHANE,Rachid,18)
(BOULLAIRE,Alexandre,16)
(BOYER,Raphael,17)
A : {nom:chararray, prenom:chararray,
note:float)
STORE A INTO 'results' USING PigStorage(',');
u
Un répertoire "results" sera crée avec un fichier part-r-00000 contenant
ADAM,Guillaume,15
BERCHANE,Rachid,18
BOULLAIRE,Alexandre,16
BOYER,Raphael,17
M2 Informatique
INFO0939
L.A. Steffenel
Sauvegarde de Données - Exemple
u
Si on utilise:
STORE A INTO 'results' USING JsonStorage();
u
Un fichier part-r-00000 dans le répertoire aura pour contenu :
{"nom":"ADAM","prenom":"Guillaume","note":15.0}
{"nom":"BERCHANE","prenom":"Rachid","note":18.0}
{"nom":"BOULLAIRE","prenom":"Alexandre","note":16.0}
{"nom":"BOYER","prenom":"Raphael","note":17.0}
u
Pig va également créér un fichier .pig_schema; si on recharge plus tard les
données avec JsonLoader, le schéma sera automatiquement déduit
M2 Informatique
INFO0939
L.A. Steffenel
Pig – Exécution interactive
u
En mode interactif, on tape ses instructions Pig Latin dans une invité de
commande (grunt). Pour ce faire, il suffit de le lancer avec la commande:
machine$ pig
grunt>
u
Dans ce mode, il détectera automatiquement si oui ou non Hadoop est
présent et se placera dans le mode d'exécution qui correspond (on peut
également forcer le mode à utiliser, toujours avec l'option -x).
u
Par exemple:
pig -x local
u
ou encore:
pig -x mapreduce
u
Note : Les dernières versions (>=0.14) permettent aussi l'utilisation du
gestionnaire Tez avec l'option –x tez_local ou –x tez
M2 Informatique
INFO0939
L.A. Steffenel
Pig – exécution d'un script
u
Pig fonctionne aussi comme un interpréteur de scripts
u
u
Il suffit d'exécuter un script pig avec l'interpréteur
Pour lancer Pig avec Hadoop, on utilisera la commande :
pig -x mapreduce fichier.pig
u
Il est également possible de l'exécuter en mode local, qui ignore
complètement Hadoop et HDFS
u
Pas de tâches parallèles/distribuées, pas de HDFS
pig -x local fichier.pig
M2 Informatique
INFO0939
L.A. Steffenel
Pig – Autres commandes utiles en mode
intéractif
u
cat: comme la commande « cat » Unix, elle affiche le contenu d'un fichier.
u
dans le cadre de Pig, elle est étendue au fonctionnement Hadoop : la commande
affichera automatiquement le contenu concaténé́ de tous les fichiers du répertoire
(utile pour vérifier un ensemble de données d'entrée/de sortie)
u
help : affiche une aide
u
sh [COMMANDE] : exécute une commande shell
u
exec [FICHIER.PIG] : exécute le script pig indiqué
u
history : affiche un historique de toutes les commandes utilisées
u
ls, mkdir, rm, etc. : équivalentes à leur versionUnix
M2 Informatique
INFO0939
L.A. Steffenel
Traitement des Données
Opérateur FILTER
u
L'opérateur FILTER permet de filtrer les éléments d'un alias selon une ou
plusieurs conditions
u
Format :
DEST = FILTER SOURCE BY EXPRESSION;
u
Equivalent au WHERE de SQL. On pourra faire par exemple :
B = FILTER A BY note > 10;
u
Ou
B = FILTER A BY note > 10 AND ((annee_naissance+age)<2014);
u
Ou encore
B = FILTER A BY prenom MATCHES 'Guillaume';
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur ORDER
u
L'opérateur ORDER permet de trier les éléments selon une condition
u
Equivalent du ORDER BY de SQL
u
Format :
DEST = ORDER SOURCE BY FIELD [ASC|DESC];
u
On pourra ainsi faire par exemple :
B = ORDER A BY note DESC;
u
Ou :
B = ORDER A BY note DESC, nom ASC;
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur GROUP
u
Permet de grouper les tuples selon un champs
u
Génère des tuples constitués de deux champs :
u
Le premier (group), est un champs simple
u
u
Le second, qui porte le nom de l'alias sur lequel a été appliqué GROUP, est un bag
qui contient une série de tuples
u
u
contient la valeur unique du champs utilisé lors de l'appel à GROUP
Contient tous les tuples pour lesquels la valeur en question a été rencontrée
Format :
DEST = GROUP SOURCE BY FIELD;
M2 Informatique
INFO0939
L.A. Steffenel
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur GROUP
u
Par exemple
u
B = GROUP A BY note;
u
DUMP B;
ADAM,Guillaume,15
BERCHANE,Rachid,15
BOULLAIRE,Alexandre,16
DUMP A;
(ADAM,Guillaume,15)
(BERCHANE,Rachid,15)
(BOULLAIRE,Alexandre,16)
(15,{(BERCHANE,Rachid,15),(ADAM,Guillaume,15)})
(16,{(BOULLAIRE,Alexandre,16)})
u
DESCRIBE B;
B: {group:float,A:{(nom:chararray,prenom:chararray,note:float)}}
Opérateur FOREACH...GENERATE
u
L'opérateur FOREACH ... GENERATE permet d'itérer chacun des tuples du bag
de l'alias concerné, et de générer d'autres tuples pour chacun d'entre eux
u
Format :
DEST = FOREACH SOURCE GENERATE EXPRESSION;
u
Au sein de l'expression, on peut générer des bags, des tuples, des maps, etc.
et appeler des fonctions à la volée
u
On peut également nommer des champs générés de cette manière au sein de
l'appel à GENERATE
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur FOREACH...GENERATE
u
Par exemple
u
B = FOREACH A GENERATE note;
u
DUMP B;
ADAM,Guillaume,15
BERCHANE,Rachid,15
BOULLAIRE,Alexandre,16
(15)
(15)
(16)
u
DESCRIBE B;
B: {note: float}
DUMP A;
(ADAM,Guillaume,15)
(BERCHANE,Rachid,15)
(BOULLAIRE,Alexandre,16)
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur FOREACH...GENERATE
DUMP A;
(ADAM,Guillaume,15)
(BERCHANE,Rachid,15)
(BOULLAIRE,Alexandre,16)
u
Par exemple
u
B = FOREACH A GENERATE (nom,prenom) AS infos, note;
u
DUMP B;
ADAM,Guillaume,15
BERCHANE,Rachid,15
BOULLAIRE,Alexandre,16
((ADAM,Guillaume),15.0)
((BERCHANE,Rachid),15.0)
((BOULLAIRE,Alexandre),16.0)
u
DESCRIBE B;
B: {infos: (nom: chararray,prenom: chararray),note: float}
M2 Informatique
INFO0939
L.A. Steffenel
Opérateur FOREACH...GENERATE
u
M2 Informatique
INFO0939
L.A. Steffenel
Il est également possible d'imbriquer des traitement plus complexe
DEST = FOREACH SOURCE {
OPERATION_1;
OPERATION_2;
... etc ...
};
u
Si par exemple nos données ont la forme
A: {infos: (nom: bytearray,prenom: bytearray), notes: (n1: bytearray,n2: bytearray,n3: bytearray)}
u
On pourrait obtenir la moyenne de chaque étudiant avec l'opération
B = FOREACH A {
C = (notes.n1+notes.n2+notes.n3)/3.0; GENERATE infos,C as moyenne;
};
Opérateur FLATTEN
u
L'opérateur FLATTEN permet "d'applatir" un ensemble de tuples et bags pour
les transformer en de simples tuples
u
Par exemple, si on a une liste de tuples dans un alias B au format suivant :
(15,{(BERCHANE,Rachid,15),(ADAM,Guillaume,15)})
(16,{(BOULLAIRE,Alexandre,16)})
B: {group:float,A:{(nom:chararray,prenom:chararray,note:float)}}
u
Après l'opération C = FOREACH B GENERATE FLATTEN(A); on obtiendra :
(BERCHANE,Rachid,15.0)
(ADAM,Guillaume,15.0)
(BOULLAIRE,Alexandre,16.0)
M2 Informatique
INFO0939
L.A. Steffenel
Autres opérateurs utiles
u
Autres opérateurs utiles dans Pig:
u
JOIN : fait la jointure de deux alias selon des clés étrangères données
u
CROSS : le produit cartésien (jointure) des tuples de deux alias
u
LIMIT : récupérer les N premiers tuples d'un alias (head)
u
SPLIT : générer plusieurs alias à partir d'un alias selon des expressions
conditionnelles
u
DISTINCT : éliminer les tuples identiques au sein d'un alias
u
SAMPLE : obtenir une sous-sélection aléatoire de tuples depuis un alias (par
exemple, récupérer 10% des tuples d'un alias de manière aléatoire)
u
Pour d'autres opérateurs, il faut consulter la documentation officielle de Pig
M2 Informatique
INFO0939
L.A. Steffenel
Chaînes de Caractères
u
Pig propose de nombreuses fonctions pour la manipulation des types chaîne de
caractère
u
Quelques exemples :
u
TOKENIZE : découpe les différents mots d'une ligne ; génère un bag contenant
un tuple pour chacun des mots
("exemple de phrase")
("autre exemple")
u
B = FOREACH A GENERATE TOKENIZE($0);
u
DUMP B;
({("exemple"), ("de"), ("phrase")})
({("autre"),("exemple")})
M2 Informatique
INFO0939
L.A. Steffenel
Chaînes de Caractères
u
SIZE : renvoie la taille d'une chaîne de caractères
u
SUBSTRING : permet de récupérer une sous-chaîne de caractères
u
STRSPLIT : permet de découper une chaîne de caractères à partir d'une
expression régulière
u
LOWER : converti une chaîne en minuscules
u
REPLACE : remplacement dans une chaîne (supporte là aussi les regexp)
u
et d'autres (là aussi, consulter la documentation)
M2 Informatique
INFO0939
L.A. Steffenel
Fonctions Mathématiques
u
Pig propose un certain nombre de fonction pour la manipulation des
nombres
u
Quelques exemples:
u
ABS : renvoie la valeur absolue d'un nombre
u
COS/SIN/TAN : cosinus/sinus/tangente
u
RANDOM : génère un flottant aléatoire entre 0 et 1
u
ROUND : génère l'arrondi d'un nombre
u
... et d'autres (même remarque).
M2 Informatique
INFO0939
L.A. Steffenel
Autres Fonctions Utiles
u
Pig propose enfin quelques autres fonctions utiles :
u
COUNT(bag) : renvoie le nombre de tuples contenus au sein d'un bag
u
CONCAT(f1, f2, f3, ...) : concatène une série de champs d'un tuple
u
Supporte la concaténation des nombres (leur représentation textuelle)
u
SUBSTRACT(b1, b2) : renvoie un bag constitué des éléments présents
dans le bag b1 mais absents du bag b2
u
SUM(bag) : renvoie la somme des éléments numériques contenus au
sein d'un bag
M2 Informatique
INFO0939
L.A. Steffenel
Exemple : WordCount
Exemple : WordCount, version Pig
u
On prend le fichier d'entrée poeme.txt :
Celui qui croyait au ciel
Celui qui ny croyait pas
Tous deux adoraient la belle
Prisonniere des soldats
u
On commence par charger les données:
u
A = LOAD 'poeme.txt' USING TextLoader AS ligne:chararray;
u
Après chargement :
u
DUMP A;
(Celui qui croyait au ciel)
(Celui qui ny croyait pas)
(Tous deux adoraient la belle)
(Prisonniere des soldats)
DESCRIBE A;
A: {ligne: chararray}
M2 Informatique
INFO0939
L.A. Steffenel
Exemple : WordCount, version Pig
u
M2 Informatique
INFO0939
L.A. Steffenel
On exécute ensuite:
B = FOREACH A GENERATE TOKENIZE(LOWER(ligne)) AS mots;
u
u
Pour chaque ligne, convertit en minuscules, puis génère un bag de tuples, un pour
chacun des mots de la ligne en minuscules (fonction TOKENIZE)
u
On donne également un nom au bag en question : "mots"
DUMP B;
({(celui),(qui),(croyait),(au),(ciel)})
({(celui),(qui),(ny),(croyait),(pas)})
({(tous),(deux),(adoraient),(la),(belle)})
({(prisonniere),(des),(soldats)})
DESCRIBE B;
B: {mots: {tuple_of_tokens: (token: chararray)}}
Exemple : WordCount, version Pig
u
On exécute ensuite:
C = FOREACH B GENERATE FLATTEN(mots) AS mot;
u
u
Pour chaque tuple, "déplie" le bag contenant chacun des mots et de génère pour
chacun des tuples contenu dans ce bag un tuple indépendant
u
On donne également un nom à ces tuples désormais indépendants : "mot"
DUMP C;
DESCRIBE C;
(celui)
(qui)
(croyait)
(au)
(ciel)
(celui)
(qui)
...
C: {mot: chararray}
M2 Informatique
INFO0939
L.A. Steffenel
Exemple : WordCount, version Pig
u
On exécute ensuite:
D = GROUP C BY mot;
... ce qui aura pour effet de regrouper les tuples par mot commun
u
L'opérateur GROUP va générer un tuple constitué d'un premier membre
"group" qui contient le mot unique en question, et d'un second membre "C" de
type bag qui contient tous les tuples correspondant à cette valeur.
u
DUMP D;
(au,{(au)})
(la,{(la)})
(ny,{(ny)})
(qui,{(qui),(qui)})
(tous,{(tous)})
(belle,{(belle)})
(celui,{(celui),(celui)})
(croyait,{(croyait),(croyait)})
...
M2 Informatique
INFO0939
L.A. Steffenel
DESCRIBE D;
D: {group: chararray,C: {(mot: chararray)}}
Exemple : WordCount, version Pig
u
On exécute enfin :
E = FOREACH D GENERATE group AS mot, COUNT(C) as occurrences;
u
... ce qui aura pour effet de parcourir l'alias D et, pour chaque tuple, de récupérer le
premier membre "group" et le nombre de tuples du second membre de type bag "C"
u
On génère un nouveau tuple à partir de ces deux informations : on donne au premier
champs le nom "mot", et au second le nom "occurences"
u
DUMP E;
DESCRIBE E;
(au,1)
(la,1)
(qui,2)
(belle,1)
(celui,2)
(croyait,2)
(soldats,1)
(prisonniere,1)
...
E: {mot: chararray,occurrences: long}
M2 Informatique
INFO0939
L.A. Steffenel
Exemple : WordCount, version Pig
u
Il reste enfin à sauvegarder les données:
STORE E INTO '/results';
u
Puisqu'on ne précise pas de fonction de stockage, Pig utilisera par défaut
PigStorage('\') : il devrait écrire chacun des tuple sur une ligne textuelle, en séparant
chacun des champs par une tabulation
u
La méthode générera un répertoire /results (sur HDFS ou le système de fichiers local),
qui contiendra une série de fichier part-r-XXXXX avec les différents tuples de E.
M2 Informatique
INFO0939
L.A. Steffenel
Exemple : WordCount, version Pig
Contenu du fichier /results/part-r-00000
au 1
la 1
ny 1
des 1
pas 1
qui 2
ciel 1
deux 1
tous 1
belle 1
celui 2
croyait 2
soldats 1
adoraient 1
prisonniere 1
M2 Informatique
INFO0939
L.A. Steffenel
User Defined Functions
Pourquoi éteindre Pig ?
u
Pig a un grand nombre de fonctions prêtes à l'usage. Cependant, dans
beaucoup de cas complexes, on a besoin d'effectuer des traitements qui
dépassent les seules fonctions standard de Pig
u
Pig implémente le concept de User Defined Functions. Il s'agit d'un mécanisme
permettant d'étendre Pig grâce à des "plug-ins" utilisateur
u
Il suffit de développer la fonction dont on a besoin en Java (en implémentant
certaines interfaces Pig) et, une fois compilées, elles deviennent disponibles
au sein de tout programme Pig chargeant le .jar correspondant
u
Il est également possible de développer ces fonctions en Python / autres
langages (par un mécanisme similaire à Streaming pour Hadoop).
M2 Informatique
INFO0939
L.A. Steffenel
Used Defined Functions
u
Pour charger un .jar depuis un programme Pig, on utilise la commande
REGISTER. Par exemple :
REGISTER udf.jar;
u
On peut ensuite simplement invoquer une fonction à partir de son classpath
directement depuis le langage Pig Latin. Par exemple:
u
B = FOREACH A GENERATE org.mbds.udf.UpperCase(nom);
u
(en supposant qu'une classe org.mbds.udf.UpperCase existe au sein du fichier
udf.jar d'exemple)
M2 Informatique
INFO0939
L.A. Steffenel
UDF - exemple
u
On souhaite implémenter un détecteur de anagrammes
u
Trouver des mots qui ont les mêmes lettres, mais dans différents ordres
u
L'implémentation Map-Reduce consiste à trouver une clé composée des lettres du
mot, triées en ordre alphabétique
u
Il n'y a pas de moyen depuis les fonctions standard Pig de générer cette clé
u
On doit rédiger une fonction Pig additionnelle pour implémenter cette
opération : elle prendra en entrée une chaîne de caractères, et fournira en
sortie la même chaîne avec les lettres ordonnées alphabétiquement
u
On décide d'appeler cette classe SortLetters au sein d'un package :
org.mbds.hadoop.pigudfs
M2 Informatique
INFO0939
L.A. Steffenel
UDF -Defined
exempleFunctions - Exemple
User
9-63
M2 Informatique
INFO0939
L.A. Steffenel
UDF - exemple
u
Une fois ce code compilé dans un .jar, on pourra l'appeler au sein de tout
programme Pig :
REGISTER mbds_udfs.jar;
u
Et si on utilise: org.mbds.hadoop.pigudfs.SortLetter(field) alors on recevra
en valeur de retour la valeur de la chaîne field, avec les lettres triées
alphabétiquement
M2 Informatique
INFO0939
L.A. Steffenel
Lancer Pig à partir de Java
u
De manière similaire à un UDF, des fois on veut avoir plus de contrôle sur
notre code
u
Il est possible d'exécuter Pig à partir d'un code Java, et aussi profiter de
l'environnement de programmation entier pour préparer certaines étapes
u
Exemple
register /mylocation/tokenize.jar
A = load 'mytext' using TextLoader();
B = foreach A generate flatten(tokenize($0));
C = group B by $1;
D = foreach C generate flatten(group), COUNT(B.$0);
store D into 'myoutput';
M2 Informatique
INFO0939
L.A. Steffenel
Lancer Pig à partir de Java
M2 Informatique
INFO0939
L.A. Steffenel
Lancer Pig à partir de Java
u
Pour exécuter le programme, il faut d'abord le compiler
u
u
Si la compilation réussie, il suffit d'exécuter le code
u
u
javac -cp <path>pig.jar WordCount.java
java -cp <path>pig.jar WordCount
Quelques notes :
u
La classe "tokenizer.jar" doit être registrée dans HDFS car elle est appelée
par Pig
u
Les quatre appels "pigServer.registerQuery()" ne font qu'empiler les
commandes ; Pig n'executer la tâche que lorsqu'on appelle
"pigServer.store()"
u
Le résultat est stocké dans HDFS
M2 Informatique
INFO0939
L.A. Steffenel
Lancer Pig à partir de Python, Javascript, etc
u
Pig peut être aussi inclus dans du code Python, Javascript ou Groove
u
Utilise trois étapes similaires à celles d'un "stored procedure" em JDBC
u
u
Compile – précompile une squelette avec les grandes lignes de l'exécution
u
Bind – associe des variables et valeurs au squelette
u
Run – exécute le code Pig
Pour plus d'information, la documentation Pig offre des exemples et détails
u
http://pig.apache.org/docs/r0.15.0/cont.html#embed-python
M2 Informatique
INFO0939
L.A. Steffenel
Sources
u
Les cours de Benjamin Renaut (http://cours.tokidev.fr/bigdata/)
u
Les modules sur Pig dans le cours "Introduction to Big Data Analysis" de
Coursera/San Diego Supercomputing Center
u
Les livres "Hadoop: The Definitive Guide" et "Programming Pig"
M2 Informatique
INFO0939
L.A. Steffenel

Documents pareils