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