0582 Outils Hadoop Pour Le Bigdata
0582 Outils Hadoop Pour Le Bigdata
0582 Outils Hadoop Pour Le Bigdata
février-mars 2018
Abstract
Il s’agit des transparents du cours mis sous une forme plus facilement imprimable et lisible.
Ces documents ne sont pas totalement libres de droits. Ce sont des supports de cours
mis à votre disposition pour vos études sous la licence Creative Commons Attribution - Pas
d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.
1 Principes du « Map-Reduce » 12
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.1 Pourquoi ce cours ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.2 Préfixes multiplicatifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.3 Mégadonnées ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.4 Distribution données et traitements . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.5 Un Data Center . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.6 Serveur « lame » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.7 Machines connectées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1.8 Hadoop ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2 Hadoop File System (HDFS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.2 Organisation des fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.3 Commande hdfs dfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.4 Échanges entre HDFS et le monde . . . . . . . . . . . . . . . . . . . . . . . . 16
1
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
2
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
3
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
5
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4 Spark 60
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.1.1 Présentation de Spark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.1.2 Avantages de Spark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.1.3 Premier exemple Spark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.1.4 Principe du traitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.5 Programme pySpark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.6 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.7 Lancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.1.8 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.1.9 Fonction lambda ou fonction nommée ? . . . . . . . . . . . . . . . . . . . . . 62
4.1.10 Fonction lambda ou fonction nommée ? . . . . . . . . . . . . . . . . . . . . . 63
4.1.11 Fonction lambda ou fonction nommée ? . . . . . . . . . . . . . . . . . . . . . 63
4.1.12 Dernière remarque sur les fonctions . . . . . . . . . . . . . . . . . . . . . . . 63
4.2 Éléments de l’API Spark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.1 Principes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.2 Début d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.3 RDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.4 RDD (suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2.5 Lire et écrire des SequenceFile . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2.6 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2.7 Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.8 Transformations de type map . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.9 Transformations de type map (suite) . . . . . . . . . . . . . . . . . . . . . . 66
4.2.10 Transformations ensemblistes . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.2.11 Transformations ensemblistes (suite) . . . . . . . . . . . . . . . . . . . . . . . 67
4.2.12 Transformations sur des paires (clé, valeur) . . . . . . . . . . . . . . . . . . . 67
4.2.13 Transformations de type jointure . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3 SparkSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
5 Cassandra et SparkSQL 73
5.1 Cassandra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.1.1 Présentation rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.1.2 Modèle de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.1.3 Structure du cluster et données . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.1.4 Communication entre machines . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.1.5 Cohérence des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.1.6 Théorème CAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.1.7 Théorème CAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.1.8 Modèle de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.1.9 Stockage des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.1.10 Réplication et redistribution des données . . . . . . . . . . . . . . . . . . . . 75
5.1.11 Stockage des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.1.12 Informations sur le cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.1.13 Connexion au shell Cassandra CQL . . . . . . . . . . . . . . . . . . . . . . . 76
5.1.14 Premières commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.1.15 Affichage d’informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.16 Premières commandes, suite . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.17 Identification des n-uplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
6 ElasticSearch et Kibana 83
7 Pig 84
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.1.1 Présentation de Pig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.1.2 Exemple de programme Pig . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.1.3 Comparaison entre SQL et Pig Latin . . . . . . . . . . . . . . . . . . . . . . 84
7.2 Langage Pig Latin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.2.1 Structure d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.2.2 Exécution d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.2.3 Relations et alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.2.4 Enchaînement des instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.2.5 Relations et types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
9
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
8 HBase et Hive 95
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.1.1 Présentation de HBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.1.2 Structure interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.1.3 Tables et régions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.1.4 Différences entre HBase et SQL . . . . . . . . . . . . . . . . . . . . . . . . . 96
8.1.5 Structure des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
8.1.6 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
8.1.7 Nature des clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.1.8 Ordre des clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.1.9 Choix des clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.1.10 Éviter le hotspotting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.2 Travail avec HBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.2.1 Shell de HBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.2.2 Commandes HBase de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.2.3 Création d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.2.4 Destruction d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
8.2.5 Ajout et suppression de n-uplets . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2.6 Affichage de n-uplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2.7 Recherche de n-uplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2.8 Filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2.9 Filtres, suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.2.10 Filtres, suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.2.11 Comptage de n-uplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.3 API Java de HBASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.3.2 Imports communs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.3.3 Création d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.3.4 Suppression d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.3.5 Manipulation d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
8.3.6 Insertion d’une valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
8.3.7 Transformation en tableaux d’octets . . . . . . . . . . . . . . . . . . . . . . . 102
8.3.8 Transformation inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
8.3.9 Insertion d’une valeur, fonction . . . . . . . . . . . . . . . . . . . . . . . . . 103
10
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
11
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 1
Principes du « Map-Reduce »
1.1. Introduction
1.1.1. Pourquoi ce cours ?
Selon LinkedIn, les compétences les plus recherchées depuis plusieurs années sont :
• 1) Cloud and Distributed Computing (Hadoop, Big Data)
• 2) Statistical Analysis and Data Mining (R, Data Analysis)
• 10) Storage Systems and Management (SQL)
Voir ces transparents pour la liste en France, qui est très similaire et inclut la connaissance de Python
en 13e position.
12
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
1.1.3. Mégadonnées ?
Les mégadonnées ou Big Data sont des collections d’informations qui auraient été considérées comme
gigantesques, impossible à stocker et à traiter, il y a une dizaine d’années.
• Internet : Google en 2015 : 10 Eo (10 milliards de Go), Facebook en 2014 : 300 Po de données
(300 millions de Go), 4 Po de nouvelles données par jour, Amazon : 1 Eo.
• BigScience : télescopes (1 Po/jour), CERN (500 To/jour, 140 Po de stockage), génome,
environnement. . .
Les informations sont très difficiles à trouver.
La raison est que tout est enregistré sans discernement, dans l’idée que ça pourra être exploité. Certains
prêchent pour que les données collectées soient pertinentes (smart data) plutôt que volumineuses.
Il semble que Google utilise des ordinateurs assez basiques, peu chers mais extrêmement nombreux
(106 ), consulter wikipedia.
13
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
14
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
L’exécution des programmes est également distribuée : ils sont exécutés sur une ou plusieurs machines
du réseau.
Tout ce module vise à enseigner la programmation d’applications sur un cluster, à l’aide des outils
Hadoop.
1.1.8. Hadoop ?
15
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
16
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Les datanodes contiennent des blocs, le namenode sait où sont les fichiers : quels blocs et quels
datanodes.
Consulter cette page pour des explications complètes.
1.2.8. Explications
Les datanodes contiennent des blocs (notés A,B,C. . . ). Les mêmes blocs sont dupliqués (replication)
sur différents datanodes, en général 3 fois. Cela assure :
• fiabilité des données en cas de panne d’un datanode,
• accès parallèle par différents processus aux mêmes données.
Le namenode sait à la fois :
• sur quels blocs sont contenus les fichiers,
• sur quels datanodes se trouvent les blocs voulus.
On appelle cela les metadata.
Inconvénient majeur : panne du namenode = mort de HDFS, c’est pour éviter ça qu’il y a le secondary
namenode. Il archive les metadata, par exemple toutes les heures.
17
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Les namenodes de secours se comportent comme des clones. Ils sont en état d’attente et mis à jour
en permanence à l’aide de services appelés JournalNodes.
Les namenodes de secours font également le même travail que le secondary namenode, d’archiver
régulièrement l’état des fichiers, donc ils rendent ce dernier inutile.
1.2.11. Exemple
Voici quelques manipulations sur un fichier :
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import ...;
18
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
19
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
HDFSwrite: HDFSwrite.jar
hadoop jar HDFSwrite.jar
HDFSread: HDFSread.jar
hadoop jar HDFSread.jar
HDFSinfo: HDFSinfo.jar
hadoop jar HDFSinfo.jar
1.3.2. Exemple
Soient les 4 n-uplets fictifs suivants :
Calculer le prix maximal, moyen ou total peut s’écrire à l’aide d’algorithmes, étudiés en première
année, du type :
20
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Pour l’efficacité, les valeurs intermédiaires ne sont pas stockées mais transmises entre les deux fonctions
par une sorte de tube (comme dans Unix). Le programme ne s’écrit donc pas tout à fait comme ça.
data = [
{'id':1, 'marque':'Renault', 'modele':'Clio', 'prix':4200},
{'id':2, 'marque':'Fiat', 'modele':'500', 'prix':8840},
{'id':3, 'marque':'Peugeot', 'modele':'206', 'prix':4300},
{'id':4, 'marque':'Peugeot', 'modele':'306', 'prix':6140} ]
1.3.5. Explications
• L’écriture map(fonction, liste) applique la fonction à chaque élément de la liste. Elle effectue
la boucle « pour » de l’algorithme précédent et retourne la liste des prix des voitures. Ce
résultat contient autant de valeurs que dans la liste d’entrée.
• La fonction reduce(fonction, liste) agglomère les valeurs de la liste par la fonction et
retourne le résultat final1 .
1
En python, au lieu de reduce(max, liste), on peut écrire max(liste) directement.
21
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Ces deux fonctions constituent un couple « map-reduce » et le but de ce cours est d’apprendre à les
comprendre et les programmer.
Le point clé est la possibilité de paralléliser ces fonctions afin de calculer beaucoup plus vite sur une
machine ayant plusieurs cœurs ou sur un ensemble de machines reliées entre elles.
1.3.8. Un schéma
Voir la figure 6, page 23.
22
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Éventuellement YARN peut déplacer un processus d’une machine à l’autre en cas de défaillance ou
d’avancement jugé trop lent.
En fait, YARN est transparent pour l’utilisateur. On lance l’exécution d’un programme MapReduce
et YARN fait en sorte qu’il soit exécuté le plus rapidement possible.
23
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
1.4.4. Map
La fonction Map reçoit une paire en entrée et peut produire un nombre quelconque de paires en
sortie : aucune, une ou plusieurs, à volonté. Les types des entrées et des sorties sont comme on veut.
Cette spécification très peu contrainte permet de nombreuses choses. En général, les paires que reçoit
Map sont constituées ainsi :
• la valeur de type text est l’une des lignes ou l’un des n-uplets du fichier à traiter
• la clé de type integer est la position de cette ligne dans le fichier (on l’appelle offset en bon
français)
Il faut comprendre que YARN lance une instance de Map pour chaque ligne de chaque fichier des
données à traiter. Chaque instance traite la ligne qu’on lui a attribuée et produit des paires en sortie.
Les tâches MAP traitent chacune une paire et produisent 0..n paires. Il se peut que les mêmes clés
et/ou valeurs soient produites.
1.4.6. Reduce
La fonction Reduce reçoit une liste de paires en entrée. Ce sont les paires produites par les instances
de Map. Reduce peut produire un nombre quelconque de paires en sortie, mais la plupart du temps,
c’est une seule. Par contre, le point crucial, c’est que les paires d’entrée traitées par une instance de
Reduce ont toutes la même clé.
YARN lance une instance de Reduce pour chaque clé différente que les instances de Map ont produit,
et leur fournit uniquement les paires ayant la même clé. C’est ce qui permet d’agréger les valeurs.
En général, Reduce doit faire un traitement sur les valeurs, comme additionner toutes les valeurs
entre elles, ou déterminer la plus grande des valeurs. . .
Quand on conçoit un traitement MapReduce, on doit réfléchir aux clés et valeurs nécessaires pour
que ça marche.
24
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Les tâches Reduce reçoivent une liste de paires ayant toutes la même clé et produisent une paire qui
contient le résultat attendu. Cette paire en sortie peut avoir la même clé que celle de l’entrée.
1.4.8. Exemple
Une entreprise de téléphonie veut calculer la durée totale des appels téléphoniques d’un abonné à
partir d’un fichier CSV contenant tous les appels de tous les abonnés (n° d’abonné, n° appelé, date,
durée d’appel). Ce problème se traite ainsi :
1. En entrée, on a le fichier des appels (1 appel par ligne)
2. YARN lance une instance de la fonction Map par appel
3. Chaque instance de Map reçoit une paire (offset, ligne) et produit une paire (n° abonné, durée)
ou rien si c’est pas l’abonné qu’on veut. NB: l’offset ne sert à rien ici.
4. YARN envoie toutes les paires vers une seule instance de Reduce (car il n’y a qu’une seule clé
différente)
5. L’instance de Reduce additionne toutes les valeurs des paires qu’elle reçoit et produit une seule
paire en sortie (n° abonné, durée totale)
1.4.9. Remarques
En réalité, il n’y a pas qu’une seule instance de Reduce, il y en a plusieurs pour faire la réduction
de manière hiérarchique plus rapidement. Car en général l’algorithme qu’on écrit dans la fonction
Reduce est une boucle sur chaque valeur reçue.
Également, en réalité, il n’y a pas une instance de Map par ligne de données. C’est la vision qu’on
peut avoir en tant que programmeur, mais ça conduirait à un nombre gigantesque d’instances pour
traiter un énorme fichier. En fait, YARN instancie un seul « Mappeur » par machine esclave et appelle
sa méthode map à plusieurs reprises pour traiter les données séquentiellement.
Ce cours fait plusieurs simplifications comme cela afin de rester compréhensible pour une première
découverte de Hadoop.
25
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4. Shuffle & Sort: redistribution des données afin que les paires produites par Map ayant les
mêmes clés soient sur les mêmes machines
5. Reduce: agrégation des paires ayant la même clé pour obtenir le résultat final.
1.4.11. Un schéma
26
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
• Une sous-classe de Reducer. Elle contient également une seule méthode, appelée reduce qui
reçoit une liste de paires en paramètre. Elle génère une seule paire.
• Une classe générale qui crée un Job faisant référence aux deux précédentes classes.
Les deux premières sont des patrons (templates) paramétrées par les types des clés et des valeurs.
1.5.3. Explications
La classe Mapper est paramétrée par 4 types. Hélas, ce ne sont pas les types standard de Java, mais
des types spéciaux permettant de transmettre efficacement des données entre les différents ordinateurs
du cluster. Ça complique légèrement les programmes.
type description
Text chaîne UTF8 quelconque
BooleanWritable représente un booléen
IntWritable entier 32 bits
LongWritable entier 64 bits
FloatWritable réel IEEE 32 bits
DoubleWritable réel IEEE 64 bits
27
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
val.set(35);
int v = val.get();
28
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
1.5.8. Explications
La méthode reduce reçoit une collection de valeurs venant du Mapper. CleI et ValeursI sont les clés
et valeurs intermédiaires. Il faut itérer sur chacune pour produire la valeur de sortie du réducteur.
Comme pour map, la classe est paramétrée par les types des clés et des valeurs à manipuler. Ce sont
des Writable : Text, IntWritable. . .
Une chose cruciale n’est pas du tout vérifiée par Java : il est obligatoire que les types des clés TypCleI
et valeurs d’entrée TypValI du réducteur soient exactement les mêmes que les types des clés et valeurs
de sortie du mapper. Si vous mettez des types différents, ça passera à la compilation mais plantera à
l’exécution.
job.setMapperClass(TraitementMapper.class);
job.setReducerClass(TraitementReducer.class);
29
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
return success ? 0 : 1;
}
1.5.11. Explications
La méthode run est chargée de créer et lancer un Job. Il faut noter que la spécification Hadoop a
beaucoup changé depuis les premières versions. Il faut actuellement faire ainsi :
1. Obtenir une instance de Configuration. Elle contient les options telles que les formats des
fichiers, leur nom HDFS complet, leur codec de compression. . . voir le prochain cours.
2. Créer un Job, lui indiquer les classes concernées : mapper et reducer.
3. Fournir les noms complets des fichiers à traiter et à produire.
4. Indiquer les types des clés et valeurs. Par défaut, ce sont des Text.
5. Attendre la fin du job et retourner un code d’erreur.
Davantage de détails au prochain cours.
2. Emballage dans un fichier jar. NB: c’est plus compliqué quand il y a des packages.
4. Lancement
30
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 2
Le cours de cette semaine présente davantage de détails sur les jobs MapReduce dans YARN :
• spécification des entrées
• spécification des paires (clé, valeurs)
• spécification des sorties
• traitement de certains fichiers
• MapReduce dans d’autres langages sur YARN
31
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Exemple :
job.setNumReduceTasks(1);
job.setPriority(JobPriority.LOW);
job.setInputFormatClass(TextInputFormat.class);
Important: les types des clés et valeurs du Mapper doivent coïncider avec la classe indiquée pour le
fichier.
Ici, la classe TextInputFormat est une sous-classe de FileInputFormat<LongWritable,Text>. Donc
il faut écrire :
32
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
job.setInputFormatClass(KeyValueTextInputFormat.class);
Elles sont absolument obligatoires quand ce ne sont pas les types par défaut, ClassCastException
lors du lancement du reducer sinon.
33
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
class TraitementReducer
extends Reducer<..., Text, DoubleWritable>
La classe TextOutputFormat<K,V> est paramétrée par les types des clés et des valeurs. Par défaut,
ce sont tous deux des Text.
Il existe d’autres classes pour produire les données de sortie (voir plus loin), dont des écrivains sur
mesure (voir en TP).
YARN enregistre un fichier par Reducteur final. Leurs noms sont part-r-00000, part-r-00001,. . .
job.setOutputFormatClass(SequenceFileOutputFormat.class);
if (job.waitForCompletion(true)) {
SequenceFile.Reader.Option fichier =
SequenceFile.Reader.file(new Path(args[1],"part-r-00000"));
SequenceFile.Reader reader =
new SequenceFile.Reader(conf, fichier);
IntWritable annee = new IntWritable();
FloatWritable temperature = new FloatWritable();
while (reader.next(annee, temperature)) {
System.out.println(annee + " : " + temperature);
}
reader.close();
}
34
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
de Java. Celle de Java construit des structures plus lourdes que celle de Hadoop, parce qu’elle conti-
ennent les noms des types des données, tandis que les Writable ne contiennent que les octets des
données, et d’autre part les Writable sont modifiables (mutables).
Il existe différents types de Writable pour des collections. On va donner l’exemple d’un Writable
spécifique dérivant d’un type tableau.
35
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
36
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
public Moyenne()
{
total = 0.0;
nombre = 0L;
}
37
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
context.write(cleI, valeurI);
}
}
2.3. Efficacité
2.3.1. Remarque importante sur l’efficacité
Il faut éviter toute allocation mémoire répétée comme :
38
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Il vaut mieux créer les objets hors de la boucle et utiliser leur modificateur ainsi :
39
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
}
valeurS = new DoubleWritable(moyenne.getMoyenne());
context.write(cleI, valeurS);
}
}
Il traite des paires ayant la même clé sur la même machine que les tâches Map. Les paires qu’il émet
sont envoyées aux reducers.
40
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
job.setMapperClass(TraitementMapper.class);
job.setCombinerClass(TraitementReducer.class);
job.setReducerClass(TraitementReducer.class);
41
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
##!/usr/bin/python
## -*- coding: utf-8 -*-
import sys
## traiter chaque ligne de l'entrée standard
for ligne in sys.stdin:
# couper en mots et traiter chacun d'eux
for mot in ligne.split():
# trivialement: ce mot est en 1 exemplaire
paire = (mot, 1)
# écrire la paire
print '%s\t%s' % paire
Chaque ligne est découpée en mots ; chacun est écrit en tant que clé, avec la valeur 1 sur stdout.
42
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
cle_prec,nombre_total = None,0
for ligne in sys.stdin:
cle, valeur = ligne.split('\t', 1)
if cle == cle_prec:
nombre_total += int(valeur)
else:
if cle_prec != None:
paire = (cle_prec, nombre_total)
print '%s\t%s' % paire
cle_prec = cle
nombre_total = int(valeur)
if cle_prec != None:
paire = (cle_prec, nombre_total)
print '%s\t%s' % paire
43
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 3
Le cours de cette semaine explique comment créer une application MapReduce pour YARN complète.
Deux projets vont être expliqués. Ils concernent des statistiques sur des documents.
• calcul de la variance
• calcul de la valeur médiane
On va appliquer ça à la longueur des lignes de textes, mais ça pourrait être la durée de séjour sur une
place de parking payante, la température mesurée à midi, le nombre de sangliers dans les forêts. . .
3.0.1. Application
Soient des données : des romans sous forme de fichiers texte. On s’intéresse à la longueur des lignes
et on veut la variance. . .
1897
DRACULA
by Bram Stoker
CHAPTER I.
JONATHAN HARKER’S JOURNAL.
(Kept in shorthand.)
44
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La variance Vx d’une population xi est la moyenne des carrés des écarts des xi à la moyenne m :
1X
Vx = (xi − m)2
n i
Vous pourrez trouver la notation σ 2 pour la variance et µ ou x̄ pour la moyenne, selon la discipline
(proba ou stats).
Le problème de cette équation, c’est qu’il faut d’abord parcourir les données pour extraire la moyenne.
3.1.4. Remarques
L’algorithme précédent est peu précis lorsque les nombres sont petits en valeur absolue. Il est alors
préférable d’utiliser une variante dans laquelle on décale toutes les valeurs d’une même constante.
En effet, Vx+K = Vx .
On choisit alors K = x1 , c’est à dire le premier x des données. Cela donne quelque chose comme ça
pour le 2e point page précédente :
si n==0 alors K = x
n += 1 ; Sx += (x-K) ; Sx2 += (x-K)*(x-K)
mais c’est difficilement applicable dans le cadre MapReduce, car il faut traiter à part l’une des données
et transmettre la constante K à toutes les autres, ou alors choisir K arbitrairement.
45
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Writable;
Notez les types : c’est du « Big Data », donc potentiellement, les données peuvent être énormes. Un
int est limité à ±2 milliards.
46
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
public Variance()
{
clear();
}
47
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Avec ça, cette classe peut facilement être intégrée dans un autre projet ou modifiée pour un autre
calcul mathématique du même genre (cumul de valeurs).
48
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
@Override
public void map(LongWritable cleE, Text valeurE, Context context)
throws IOException, InterruptedException
{
valeurI.set( valeurE.getLength() );
context.write(cleI, valeurI);
}
valeurE contient l’une des lignes du texte à traiter. cleE contient son offset, c’est à dire le numéro
du premier octet de la ligne.
3.1.16. Combiner
Ce processus est optionnel de deux manières : d’une part on peut s’en passer, et d’autre part, même
programmé, il n’est pas forcément lancé par YARN. S’il est lancé, il est associé à un Mapper et il
tourne pour réduire les données venant d’une seule machine.
Son rôle est d’avancer le travail du Reducer. On va lui demander de calculer les sommes partielles.
Comme il se trouve entre le Mapper et le Reducer, son entête est :
public class VarianceLongueurLignesCombiner
extends Reducer<Text, Variance, Text, Variance>
{
On doit remettre les mêmes types en entrée et en sortie pour les clés et valeurs.
49
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La clé d’entrée est recopiée en sortie et les valeurs d’entrée sont additionnées. On va retrouver ce
même schéma dans le reducer.
La clé de sortie sera encore la même clé. C’est comme ça quand on calcule une information synthétique
sur la totalité des données. On aurait des clés différentes s’il fallait distinguer différentes variances.
@Override
public void reduce(Text cleI, Iterable<Variance> valeursI, Context context)
throws IOException, InterruptedException
{
Text cleS = cleI;
total.clear();
50
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
3.1.21. Driver
Il a plusieurs choses à faire :
• Vérifier les paramètres. Ils sont dans le tableau String[] args passé en paramètre de la
méthode.
• Créer le job YARN
• Définir les classes des Mapper, Combiner et Reducer afin que YARN sache quoi lancer
• Définir les types des clés et valeurs sortant du Mapper
• Définir les types des clés et valeurs sortant du Reducer
• Définir les fichiers ou dossiers à traiter : ce sont les paramètres du programme.
• Lancer le job.
C’est la fonction la plus longue de tout le logiciel.
@Override
public int run(String[] args) throws Exception
{
// vérifier les paramètres
51
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
if (args.length != 2) {
System.err.println("fournir les dossiers d'entrée et de sortie");
System.exit(-1);
}
C’est nécessaire car une fois compilé, rien ne dit à YARN quelle classe fait quoi. Le projet suivant
montrera une situation où il y a deux MapReduce successifs, donc plusieurs classes pour le même
type de travail.
La classe TextInputFormat fait que les paires fournies au mapper seront des (LongWritable, Text).
52
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Le reducer écrira le résultat, une paire (Text, DoubleWritable) dans un fichier appelé part-r-00000
dans le dossier de sortie.
La méthode run doit retourner un code d’erreur : 0=ok, 1=erreur. Or la méthode waitForCompletion
retourne un booléen valant true si c’est ok, false si ça a planté.
Télécharger le projet complet VarianceLongueurLignes.tar.gz.
2. Création d’une archive jar. On doit dire quelle est la classe principale, celle qui contient
main().
C’est plus compliqué si les fichiers source sont placés dans un dossier src et qu’il faut un dossier bin
pour mettre les binaires, et aussi s’il y a des paquetages. Voir le Makefile des TP.
53
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
3. Affichage des messages. Il faut connaître l’identifiant de l’application. Il est affiché dans les
premières lignes suivant le lancement. Il est utile de rajouter | more à la commande.
3.1.29. Bilan
• Écrire le calcul à la manière MapReduce
L’écriture initiale ne le permet pas. Il faut trouver un moyen de ré-écrire la formule afin de
paralléliser les calculs. Ici, ce sont les sommes partielles sur plusieurs données (1, x et x2 ) qui
peuvent être faites simultanément par les combiners. Par contre, cela demande des connaissances
en mathématiques (Théorème de König-Huygens, wikipedia) qui sont hors compétence.
Si on ne trouve pas les bonnes formules, on ne peut pas faire le travail en MapReduce.
• Définir la structure de données échangée entre les mappers et le reducer
Si on ne peut pas faire avec les types prédéfinis simples, on doit implémenter la classe Writable
et rajouter les méthodes utiles.
54
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La somme des nombres d’un côté, par exemple à gauche entre 0 et 63 est juste inférieure à la moitié
du nombre total de lignes.
55
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
{
cleI.set(valeurE.getLength());
context.write(cleI, valeurI);
}
}
56
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
etape1.setOutputFormatClass(SequenceFileOutputFormat.class);
FileOutputFormat.setOutputPath(etape1, PathTMP1);
etape1.setOutputKeyClass(IntWritable.class);
etape1.setOutputValueClass(LongWritable.class);
etape2.setInputFormatClass(SequenceFileInputFormat.class);
FileInputFormat.addInputPath(etape2, PathTMP1);
@Override
public void map(IntWritable cleE, LongWritable valeurE, Context context)
throws IOException, InterruptedException
{
context.write(cleI, valeurE);
}
}
3.2.11. Le post-traitement
• Le premier MapReduce produit un fichier (temporaire) contenant des paires (longueur de ligne,
nombre de lignes de cette longueur). On a vu que c’était un SequenceFile.
• Le second MapReduce produit un fichier (temporaire) contenant une seule paire (0, nombre de
lignes total). C’est un simple fichier texte sur HDFS.
Il y a maintenant deux choses à faire :
1. Récupérer le nombre de lignes total issu du second MapReduce
2. Récupérer et traiter l’histogramme issu du premier MapReduce
Ce qui est important, c’est que YARN fait trier les lignes sortant du reducer dans l’ordre croissant
des clés. C’est à dire l’histogramme sera automatiquement dans l’ordre.
57
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
SequenceFile.Reader.Option fichier =
SequenceFile.Reader.file(new Path(TMP1,"part-r-00000"));
SequenceFile.Reader reader = new SequenceFile.Reader(conf, fichier);
try {
IntWritable longueur = new IntWritable();
LongWritable nombre = new LongWritable();
while (reader.next(longueur, nombre)) {
// traiter le couple (longueur, nombre)
...
}
System.out.println("resultat : "+resultat);
} finally {
reader.close();
}
58
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
On peut améliorer pour retourner une interpolation entre la longueur actuelle et sa précédente, selon
le dépassement de la limite.
3.2.15. Bilan
Cet exemple a montré comment exploiter les résultats d’un ou plusieurs MapReduce dans un même
programme. Plusieurs formats de fichiers peuvent être employés.
Télécharger le projet complet MedianeLongueurLignes.tar.gz.
59
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 4
Spark
Le cours de cette semaine présente le système de programmation Spark, un autre mécanisme de Hadoop
pour écrire des programmes de type MapReduce, nettement plus performants et plus polyvalents que
ceux basés sur YARN. Nous programmerons sur Spark en Python, mais d’autres langages comme
Scala sont possibles.
4.1. Introduction
4.1.1. Présentation de Spark
Spark est une API de programmation parallèle sur des données.
L’objet principal de Spark est le RDD : Resilient Distributed Dataset. C’est un dispositif pour traiter
une collection de données par des algorithmes parallèles robustes. Un RDD ne contient pas vraiment
de données, mais seulement un traitement.
Ce traitement n’est effectué que lorsque cela apparaît nécessaire. On appelle cela l’évaluation
paresseuse. D’autre part, Spark fait en sorte que le traitement soit distribué sur le cluster, donc
calculé rapidement, et n’échoue pas même si des machines tombent en panne.
60
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
On souhaite afficher l’année de plantation (champ n°6) de l’arbre le plus grand (champ n°7).
Avec des commandes Unix, ce traitement s’écrirait :
Par contre, j’aurais apprécié que cut permette de changer l’ordre des champs, ça aurait facilité le classement.
##!/usr/bin/python
from pyspark import SparkConf, SparkContext
sc = SparkContext(conf=SparkConf().setAppName("arbres"))
arbres = sc.textFile("hdfs:/share/paris/arbres.csv")
tableau = arbres.map(lambda ligne: ligne.split(';'))
paires = tableau.map(lambda champs: (champs[6],champs[5]))
pairesok1 = paires.filter(
lambda (hauteur,annee): hauteur!='' and hauteur!='HAUTEUR')
pairesok2 = pairesok1.map(
lambda (hauteur,annee): (float(hauteur), annee))
classement = pairesok2.sortByKey(ascending=False)
print classement.first()
4.1.6. Remarques
Les deux premières instructions consistent à extraire les données du fichier. C’est d’assez bas niveau
puisqu’on travaille au niveau des lignes et des caractères.
Dans MapReduce sur YARN, ces aspects avaient été isolés dans une classe Arbres qui masquait les
détails et fournissait des méthodes pratiques, comme getHauteur et getAnnee.
Comparé aux programmes MapReduce en Java, Spark paraît plus rustique. Mais c’est sa rapidité,
entre 10 et 100 fois supérieure à YARN qui le rend extrêmement intéressant.
61
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
On programme en Spark un peu comme dans le TP2 : la problématique est 1) d’arriver à construire
des RDD contenant ce dont on a besoin et 2) d’écrire des fonctions de traitement.
4.1.7. Lancement
Spark offre plusieurs manières de lancer le programme, dont :
• Lancement sur un cluster de Spark Workers
spark-submit --master spark://$(hostname -f):7077 \
arbres.py
L’option --master de cette commande indique à Spark qu’on doit faire appel au cluster de
machines sur lesquelles tournent des Spark Workers. Ce sont des processus clients chargés de
faire les calculs distribués pour Spark.
• Spark permet aussi de lancer l’exécution sur YARN :
spark-submit --master yarn-cluster arbres.py
Ce sont les esclaves YARN qui exécutent le programme Spark.
4.1.8. Commentaires
Le programme précédent fait appel à des lambda. Ce sont des fonctions sans nom (anonymes).
Voici une fonction avec un nom employée dans un map Python :
def double(nombre):
return nombre * 2
map(double, [1,2,3,4])
La syntaxe est lambda paramètres: expression. Ça crée une fonction qui n’a pas de nom mais
qu’on peut placer dans un map.
62
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
def separ(ligne):
return ligne.split(';')
def hauteurannee(champs):
return (champs[6],champs[5])
def garderok( (cle,val) ):
return cle!='' and cle!='HAUTEUR'
def convfloat( (cle, val) ):
return (float(cle), val)
tableau = arbres.map(separ)
paires = tableau.map(hauteurannee)
pairesok1 = paires.filter(garderok)
pairesok2 = pairesok1.map(convfloat)
total = 0
def cumuler(champs):
global total
63
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
total += float(champ[6])
return champ[5]
annees = tableau.map(cumuler)
Il y a quand même des variables globales dans Spark, mais on n’en parlera pas dans ce cours.
##!/usr/bin/python
from pyspark import SparkConf, SparkContext
nomappli = "essai1"
config = SparkConf().setAppName(nomappli)
sc = SparkContext(conf=config)
sc représente le contexte Spark. C’est un objet qui possède plusieurs méthodes dont celles qui créent
des RDD.
Pour lancer le programme, faire : spark-submit essai1.py
4.2.3. RDD
Un RDD est une collection de données abstraite, résultant de la transformation d’un autre RDD ou
d’une création à partir de données existantes. Un RDD est distribué, c’est à dire réparti sur plusieurs
machines afin de paralléliser les traitements.
On peut créer un RDD de deux manières :
• Paralléliser une collection
64
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Si votre programme contient des données itérables (tableau, liste. . . ), elles peuvent devenir un RDD.
RDD = sc.textFile("hdfs:/share/data.txt")
Comme avec MapReduce, chaque ligne du fichier constitue un enregistrement. Les transformations
appliquées sur le RDD traiteront chaque ligne séparément. Les lignes du fichier sont distribuées sur
différentes machines pour un traitement parallèle.
RDD = sc.sequenceFile("hdfs:/share/data1.seq")
RDD.saveAsSequenceFile("hdfs:/share/data2.seq")
4.2.6. Actions
Avant de voir les transformations, voyons les actions. Ce sont des méthodes qui s’appliquent à un
RDD pour retourner une valeur ou une collection.
• liste = RDD.collect() retourne le RDD sous forme d’une liste Python. Attention à la taille
si c’est du BigData.
• nombre = RDD.count() retourne le nombre d’éléments
65
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4.2.7. Transformations
Les RDD possèdent plusieurs méthodes qui ressemblent aux fonctions map, filter, etc. de Python.
En Python ordinaire, map est une fonction dont le premier paramètre est une lambda ou le nom d’une
fonction, le second paramètre est la collection à traiter :
liste = [1,2,3,4]
doubles = map(lambda n: n*2, liste)
En pySpark, map est une méthode de la classe RDD, son seul paramètre est une lambda ou le nom
d’une fonction :
liste = sc.parallelize([1,2,3,4])
doubles = liste.map(lambda n: n*2)
RDD = sc.parallelize([1,2,3,4])
print RDD.map(lambda n: n+1).collect()
RDD = sc.parallelize([1,2,3,4])
print RDD.filter(lambda n: (n%2)==0).collect()
66
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
RDD = sc.parallelize([0,1,2,3])
print RDD.flatMap(lambda n: [n]*n).collect()
En Python, la notation [chose]*n produit la liste [ chose chose chose. . . ] contenant n éléments. Si
n=0, ça crée une liste vide. Exemple ['ok']*3 vaut ['ok', 'ok', 'ok'].
Donc, ici, les résultats de la lambda sont [], [1], [2, 2], [3, 3, 3] et au retour du flatMap on
aura [1, 2, 2, 3, 3, 3]
67
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4.3. SparkSQL
4.3.1. Présentation
SparkSQL rajoute une couche simili-SQL au dessus des RDD de Spark. Ça s’appuie sur deux concepts :
DataFrames Ce sont des tables SparkSQL : des données sous forme de colonnes nommées. On peut
les construire à partir de fichiers JSON, de RDD ou de tables Hive (voir le dernier cours).
RDDSchema C’est la définition de la structure d’un DataFrame. C’est la liste des colonnes et de
leurs types. Un RDDSchema peut être défini à l’aide d’un fichier JSON.
Il y a des liens entre DataFrame et RDD. Les RDD ne sont que des données, des n-uplets bruts. Les
DataFrames sont accompagnées d’un schéma.
##!/usr/bin/python
from pyspark import SparkConf, SparkContext, SQLContext
from pyspark.sql.functions import *
nomappli = "essai1"
config = SparkConf().setAppName(nomappli)
sc = SparkContext(conf=config)
sqlContext = SQLContext(sc)
sqlContext représente le contexte SparkSQL. C’est un objet qui possède plusieurs méthodes dont
celles qui créent des DataFrames et celles qui permettent de lancer des requêtes SQL.
68
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
{"nom":"Paul"}
{"nom":"Émile", "age":30}
{"nom":"Victor", "age":19}
df = sqlContext.read.json("fichier.json")
Elles retournent un DataFrame df contenant les données. Voir plus loin ce qu’on peut en faire.
A savoir qu’un DataFrame ainsi créé ne connaît pas les types des colonnes, seulement leurs noms.
69
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
colonneAge = personnes.age
Note: si une propriété est vide ou vaut null, python voit None.
La propriété columns retourne la liste des noms des colonnes :
print personnes.columns
La classe DataFrame possède de nombreuses méthodes qui seront présentées plus loin, page 71.
personnes.registerTempTable("personnes")
Le DataFrame pourra être utilisé dans une requête SQL sous le nom personnes. Il est donc commode
de remettre le même nom que le DataFrame.
NB: ce n’est qu’une table temporaire, elle disparaît à la fin du programme.
Le résultat de la méthode sql est un nouveau DataFrame contenant les n-uplets demandés (doc-
umentation). On les affiche à l’aide d’une simple boucle et d’un appel à collect() comme en
pySpark.
Un autre moyen pour écrire des requêtes est d’appeler les méthodes de l’API.
70
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
En pySparkSQL :
71
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
4.4.5. Agrégation
• groupBy(colonnes) regroupe les n-uplets qui ont la même valeur pour les colonnes qui sont
désignées par une chaîne SQL. Cette méthode retourne un objet appelé GroupedData sur lequel
on peut appliquer les méthodes suivantes :
• count() : nombre d’éléments par groupe
• avg(colonnes) : moyenne des colonnes par groupe
• max(colonnes), min(colonnes) : max et min des colonnes par groupe
• sum(colonnes) : addition des colonnes par groupe
tapc = achats.groupBy("idclient").sum("montant")
napc = achats.groupBy("idclient").count()
L’agrégation crée des colonnes appelées d’après la fonction : "AVG(montant)", "MAX(montant)", etc.
4.4.6. Classement
• sort(colonnes) classe les n-uplets de self selon les colonnes, dans l’ordre croissant. Si on
spécifie la colonne par un nom pyspark (table.champ, on peut lui appliquer la méthode desc()
pour classer dans l’ordre décroissant ; sinon, il faut employer la fonction desc(colonnes) pour
classer dans l’ordre décroissant.
topa = achats.groupBy("idclient").sum("montant") \
.sort(desc("SUM(montant)")).first()
72
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 5
Cassandra et SparkSQL
Le cours de cette semaine présente le SGBD Cassandra, conçu pour le stockage de mégadonnées sous
forme de tables ressemblant à celle de SQL.
Ce qui caractérise Cassandra, c’est la distribution des n-uplets sur des machines organisées en anneau
et un langage ressemblant à SQL pour les interroger.
Un plugin permet d’utiliser pySpark pour traiter les données Cassandra.
5.1. Cassandra
5.1.1. Présentation rapide
Cassandra est totalement indépendant de Hadoop. En général, ces deux-là s’excluent car chacun
réquisitionne toute la mémoire et la capacité de calcul.
Cassandra gère lui-même la distribution et la réplication des données. Les requêtes distribuées sont
extrêmement rapides.
Cassandra offre un langage d’interrogation appelé CQL très similaire à SQL, mais beaucoup plus
limité et certains aspects sont très spécifiques.
Cassandra est issu d’un projet FaceBook, rendu libre en 2008 sous licence Apache. Une version
professionnelle est développée par DataStax.
NB: tout ne sera pas expliqué dans ce cours, il faudrait cinq fois plus de temps.
73
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
2. Les traitements sont effectués simultanément sur ces machines, selon les données qu’elles ont, par rapport à ce
qu’il faut faire.
Cassandra est également décentralisé, c’est à dire qu’aucune machine n’a un rôle particulier.
• Dans Hadoop, les machines n’ont pas les mêmes rôles : namenode, datanode, nodemanager. . .
• Au contraire, dans Cassandra, les machines ont toutes le même rôle : stocker les données et calculer les requêtes.
On peut contacter n’importe laquelle pour toute requête.
L’anneau est construit automatiquement, par découverte de proche en proche à partir de quelques machines initiales.
Un client dépose des données sur l’un des nœuds, elles sont dupliquées et envoyées aux nœuds concernés (voir plus loin).
74
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
75
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Pour faire tout cela plus facilement et ne pas surcharger le réseau, Cassandra définit des nœuds virtuels : une machine
physique contient plusieurs machines virtuelles, en fonction de leur puissance de calcul, chacune stockant un intervalle
de tokens.
nodetool info
nodetool describecluster
nodetool status
• Pour afficher la liste (énorme et incompréhensible) des intervalles de tokens machine par machine :
nodetool ring
Cela ouvre un shell CQL dans lequel on tape les requêtes (ˆD ou exit pour quitter).
La première à connaître est HELP. On peut lui ajouter un paramètre, par exemple HELP DESCRIBE.
La stratégie SimpleStrategy convient pour les clusters locaux. Ici, les données seront répliquées en 2 exemplaires.
• Suppression d’un keyspace et de tout son contenu
76
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
DESCRIBE KEYSPACES;
• Structure d’un keyspace : cela affiche toutes les commandes servant à le reconstruire ainsi que ses tables
USE nomkeyspace;
Au lieu de changer de keyspace, on peut aussi préfixer toutes les tables par nomkeyspace.nomtable
On peut préfixer le nom de la table par nomkeyspace. si on est hors keyspace ou qu’on veut en désigner un autre.
Les définitions de colonnes sont comme en SQL : nom type. Les types sont boolean, int, float, varchar, text, blob,
timestamp, etc.
Il y a des types spéciaux, comme counter, list, set, map, etc.
Voir la documentation.
77
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Contrairement à SQL, les noms des colonnes concernées sont obligatoires, mais toutes les colonnes n’ont pas obligation
d’y être, les absentes seront affectées avec null.
Exemples :
On doit mettre les noms des colonnes dans le même ordre que le fichier CSV.
Une table peut être enregistrée dans un fichier CSV par :
78
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
5.1.22. Agrégation
On peut faire ceci comme en SQL :
SELECT nomscolonnes... FROM table
...
GROUP BY clé de partition;
Les colonnes peuvent faire appel aux fonctions d’agrégation COUNT, MIN, MAX, AVG, SUM ainsi que des clauses GROUP BY.
Mais dans ce cas, il est impératif que la colonne groupée soit une clé de partition (la première dans la clé primaire).
Vous voyez que le schéma des tables doit être conçu en fonction des requêtes et non pas en fonction des dépendances
fonctionnelles entre les données. Cela implique de dénormaliser le schéma.
Il faut savoir que les valeurs supprimées sont marquées mortes, elles créent seulement une tombstone, et seront réellement
supprimées un peu plus tard.
Il en va de même avec les mises à jour, elles sont associées à un timestamp qui permet de savoir laquelle est la plus
récente sur un nœud.
79
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
5.2.2. Étapes
On suppose que la table et son keyspace sont déjà créés.
1. Dans un premier temps, il faut programmer en Java un lecteur pour les données dont on dispose.
a. D’abord, il faut préparer deux chaînes : le schéma de la table et la requête CQL d’insertion.
b. On doit créer un écrivain de SSTable. C’est une instance de CQLSSTableWriter prenant le schéma et la
requête.
c. Ensuite, on lit chaque n-uplet des données et on le fournit à l’écrivain.
Il y a une limite RAM au nombre de n-uplets pouvant être écrit ensemble, donc il faut périodiquement changer
d’écrivain.
2. Ensuite, on lance sstableloader sur ces tables.
Consulter ce blog pour un exemple complet.
Constatez que la requête d’insertion est une requête préparée. Chaque ? sera remplacé par une valeur lors de la lecture
des données, mais ça sera fait automatiquement par l’écrivain de SSTable.
int num = 0;
String outDir = String.format("/tmp/cass/%03d/ks/table",num++);
CQLSSTableWriter.Builder builder = CQLSSTableWriter.builder();
builder.inDirectory(new File(outDir))
.forTable(schema)
.using(insert)
.withPartitioner(new Murmur3Partitioner());
CQLSSTableWriter writer = builder.build();
Le dossier destination des SSTable, outDir est à définir là il y a beaucoup de place libre. D’autre part, son chemin est
structuré ainsi : dossier/n°/ks/table. Cet écrivain devra être recréé en incrémentant le numéro tous les quelques
dizaines de milliers de n-uplets.
// écrire un n-uplet
writer.addRow(col1, col2, col3);
80
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
NB: les colonnes doivent être des objets correspondant au schéma. La méthode addRow remplit les paramètres de la
requête préparée.
Il existe des variantes de addRow, consulter les sources, mais le problème principal est le nombre des allocations mémoire
qu’elle fait à chaque appel.
import org.apache.cassandra.config.Config;
for d in /tmp/cass/*
do
sstableloader -d master $d/ks/table
done
master étant le nom de l’une des machines du cluster. On doit retrouver le keyspace et le nom de la table dans le
chemin fourni à sstableloader.
On va maintenant voir comment utiliser une table Cassandra avec Spark.
81
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
##!/usr/bin/python
## -*- coding: utf-8 -*-
print clients.count()
print client.map(lambda client: client.age).filter(None).mean()
Les n-uplets sont également vus comme des dictionnaires Python, on peut accèder aux colonnes par la notation
nuplet['nomcol']
spark-submit \
--py-files /usr/lib/spark/jars/pyspark-cassandra-0.7.0.jar \
script.py
Si on doit ajouter d’autres scripts Python, tels qu’une classe pour traiter les données, il faut les ajouter après le jar,
avec une virgule pour séparer :
spark-submit \
--py-files \
/usr/lib/spark/jars/pyspark-cassandra-0.7.0.jar,client.py \
script.py
82
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 6
ElasticSearch et Kibana
Nous allons étudier une autre sorte de base de données, tournée vers l’indexation et la recherche rapide d’informations
parmi des méga-données, ElasticSearch. Nous allons aussi voir son interface graphique Kibana.
PAS FINI, c’est pour début juin 2018
83
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 7
Pig
Le cours de cette semaine présente le système Pig et son langage Pig Latin. Ce dernier est un langage de programmation
de requêtes sur des fichiers HDFS qui se veut plus simple que Java pour écrire des jobs MapReduce. Pig sert à lancer
les programmes Pig Latin dans l’environnement Hadoop.
7.1. Introduction
7.1.1. Présentation de Pig
Apache Pig est un logiciel initialement créé par Yahoo!. Il permet d’écrire des traitement utiles sur des données, sans
subir la complexité de Java. Le but est de rendre Hadoop accessible à des non-informaticiens scientifiques : physiciens,
statisticiens, mathématiciens. . .
Pig propose un langage de scripts appelé « Pig Latin ». Ce langage est qualifié de « Data Flow Language ». Ses
instructions décrivent des traitements sur un flot de données. Conceptuellement, ça ressemble à un tube Unix ; chaque
commande modifie le flot de données qui la traverse. Pig Latin permet également de construire des traitements
beaucoup plus variés et non-linéaires.
Pig traduit les programmes Pig Latin en jobs MapReduce et intègre les résultats dans le flot.
Pour l’exécuter : pig programme.pig. Ça lance un job MapReduce dans Hadoop. On peut aussi taper les instructions
une par une dans le shell de Pig.
Le but de ce cours : comprendre ce script et en écrire d’autres.
84
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
• En Pig Latin, on construit des programmes qui contiennent des instructions. On décrit exactement comment le
résultat doit être obtenu, quels calculs doivent être faits et dans quel ordre.
Également, Pig a été conçu pour les données incertaines de Hadoop, tandis que SQL tourne sur des SGBD parfaitement
sains.
Le même alias peut être réutilisé dans des instructions différentes, ce qui crée des bifurcations dans le flot de traitement
: séparations ou regroupements.
Il n’est pas recommandé de réaffecter le même alias.
85
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
L’instruction LOAD 'fichier.csv' AS schéma; permet de lire un fichier CSV et d’en faire une relation d’après le
schéma indiqué.
S1 ➭ (3,8,9) ➭ (4,5,6)
S2 ➭ (1,4,7) ➭ (3,7,5)
S3 ➭ (2,5,8) ➭ (9,5,8)
86
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
L1 ➭ {(3,8,9),(4,5,6)}
L2 ➭ {(4,8,1),(6,3,7),(7,4,5),(5,2,9),(2,7,1)}
L3 ➭ {(4,3,5),(6,7,1),(3,1,7)}
Explications :
• Le deuxième champ du schéma est spécifié ainsi :
« nom du champ »:{« type du contenu du sac »}
• Les données de ce champ doivent être au format
{« liste de valeurs correspondant au type »}
1 ➭ [nom#asterix,metier#guerrier]
2 ➭ [nom#tintin,metier#journaliste]
3 ➭ [nom#spirou,metier#groom]
Remarque : toutes ces constructions, tuple, map et bags peuvent être imbriquées, mais certaines combinaisons sont
difficiles à spécifier.
87
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Ça ressemble totalement à ce qu’on fait avec SQL. Voir l’exemple du transparent suivant.
Retourne une relation ayant un premier champ supplémentaire, le rang des n-uplets par rapport au critère indiqué.
LIMIT relation N
On l’utilise en général avec ORDER. Par exemple, cette instruction affiche les 10 plus gros achats :
88
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La condition :
• comparaisons : mêmes opérateurs qu’en C et en Java
• nullité (vide) d’un champ : IS NULL, IS NOT NULL
• connecteurs logiques : (mêmes opérateurs qu’en SQL) AND, OR et NOT
DISTINCT relation;
Note: la totalité des champs des tuples sont pris en compte pour éliminer les doublons.
Si on veut éliminer les doublons en se basant sur une partie des champs, alors il faut employer un FOREACH, voir plus
loin.
Crée une nouvelle relation contenant les champs indiqués. Ça peut être des champs de la relation fournie ou des valeurs
calculées ; la clause AS permet de leur donner un nom.
Exemple, on génère des bons d’achats égaux à 5% du total des achats des clients :
89
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
1, 1, 12.50
2, 2, 21.75
3, 3, 56.25
4, 1, 34.00
5, 3, 3.30
90
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
7.3.14. Opérateurs
Pig propose plusieurs opérateurs permettant d’agréger les valeurs d’un sac. Le sac est construit par un GROUP BY ou
GROUP ALL.
• SUM,AVG calcule la somme/moyenne des valeurs numériques.
• MAX,MIN retournent la plus grande/petite valeur
• COUNT calcule le nombre d’éléments du sac sans les null
• COUNT_STAR calcule le nombre d’éléments avec les null
Il y a d’autres opérateurs :
• CONCAT(v1, v2, ...) concatène les valeurs fournies.
• DIFF(sac1, sac2) compare les deux sacs et retourne un sac contenant les éléments qui ne sont pas en commun.
• SIZE retourne le nombre d’éléments du champ fourni.
(1, 1, 34.0)
(4, 1, 12.5)
(3, 3, 56.25)
(5, 3, 3.30)
91
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La relation achat du FILTER désigne le second champ du GROUP achatsparclient traité par le FOREACH.
Cela crée une relation ayant autant de champs que toutes les relations mentionnées. Les n-uplets qu’on y trouve sont
ceux du produit cartésien entre toutes ces relations, pour lesquels le champ1a de la relation1 est égal au champ2b de
la relation2.
Dans la nouvelle relation, les champs sont nommés relation1::champ1a, relation1::champ1b, . . .
92
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
(1,lucien,4,1,34.25)
(1,lucien,1,1,12.5)
(2,andré,2,2,21.75)
(3,marcel,3,3,56.25)
(3,marcel,5,3,3.30)
Il est très préférable que les relations aient les mêmes schémas. Chaque champ crée sa propre colonne.
7.4. Conclusion
7.4.1. Comparaison entre SQL et Pig (le retour)
Revenons sur une comparaison entre SQL et Pig. Soit une petite base de données de clients et d’achats. La voici en
SQL ; en Pig, ça sera deux fichiers CSV.
CREATE TABLE clients (
idclient INTEGER PRIMARY KEY,
nom VARCHAR(255));
CREATE TABLE achats (
idachat INTEGER PRIMARY KEY,
idclient INTEGER,
FOREIGN KEY (idclient) REFERENCES clients(idclient),
montant NUMERIC(7,2));
93
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
94
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Semaine 8
HBase et Hive
8.1. Introduction
8.1.1. Présentation de HBase
HBase est un système de stockage efficace pour des données très volumineuses. Il permet d’accéder aux données très
rapidement même quand elles sont gigantesques. Une variante de HBase est notamment utilisée par FaceBook pour
stocker tous les messages SMS, email et chat, voir cette page.
HBase mémorise des n-uplets constitués de colonnes (champs). Les n-uplets sont identifiés par une clé. À l’affichage,
les colonnes d’un même n-uplet sont affichées successivement :
95
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
8.1.6. Exemple
On veut enregistrer les coordonnées et les achats de clients. On va construire une table contenant trois familles :
• La famille personne contiendra les informations de base :
– colonnes personne:nom et personne:prenom
• La famille coords contiendra l’adresse :
– colonnes coords:rue, coords:ville, coords:cp, coords:pays
• La famille achats contiendra les achats effectués :
– colonnes achats:date, achats:montant, achats:idfacture
HBase autorise à dé-normaliser un schéma (redondance dans les informations) afin d’accéder aux données plus
rapidement.
96
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
client1
client10
client11
client2
client3
97
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Ça vient aussi du fait qu’il n’y a qu’un seul serveur par région2 . Il n’y a donc pas de parallélisme possible.
Pour résoudre ce problème, on peut disperser les clés en rajoutant du « sel », c’est à dire un bidule plus ou moins
aléatoire placé au début de la clé, de manière à écarter celles qui sont trop fréquemment demandées : un timestamp,
un hash du début de la clé. . .
hbase shell
Il faut savoir que c’est le langage Ruby qui sert de shell. Les commandes sont écrites dans la syntaxe de ce langage.
98
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
• Suppression de cellules
Il y a plusieurs variantes selon ce qu’on veut supprimer, seulement une valeur, une cellule, ou tout un n-uplet :
La première variante affiche toutes les colonnes ayant cette clé. La deuxième affiche toutes les valeurs avec leur
timestamp.
8.2.8. Filtres
L’ensemble des filtres d’un scan doit être placé entre "...".
Plusieurs filtres peuvent être combinés avec AND, OR et les parenthèses.
Exemple :
99
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
{ FILTER =>
"PrefixFilter('client') AND ColumnPrefixFilter('achat')" }
100
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Ensuite, chaque programme contient ces lignes (API 0.98) qui établissent une connexion avec le serveur HBase :
Configuration config = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(config);
try {
...
} finally {
admin.close();
}
Notez que j’ai fourni le HBaseAdmin en paramètre et que les familles sont sous forme de varargs.
101
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Dans le cas de clés de n-uplets de type nombre (int, long, float et double), le classement des clés sera fantaisiste à cause
de la représentation interne, voir cette page. Du fait que le signe du nombre soit en tête et vaut 1 pour les nombres
négatifs, 0 pour les nombres positifs, un nombre négatif sera considéré comme plus grand qu’un positif.
Il est possible d’y remédier en trafiquant le tableau d’octets afin d’inverser le signe mais c’est hors sujet.
102
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Dans certains cas, HBase nous retourne un grand tableau d’octets dans lequel nous devons piocher ceux qui nous
intéressent. Nous avons donc trois informations : le tableau, l’offset du premier octet utile et le nombre d’octets. Il
faut alors faire ainsi :
103
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
104
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
action.add(rawfam, rawcol);
• rajouter des filtres sur les valeurs, par exemple ci-dessous, on cherche les colonnes supérieures ou égales à une
limite.
NB: Il faut utiliser la classe CompareOp et BinaryComparator
Attention aux comparaisons de nombres. Elles sont basées sur la comparaison des octets internes, or généralement, les
nombres négatifs ont un poids fort plus grand que celui des nombres positifs.
8.4. Hive
8.4.1. Présentation rapide
Hive simplifie le travail avec une base de données comme HBase ou des fichiers CSV. Hive permet d’écrire des requêtes
dans un langage inspiré de SQL et appelé HiveQL. Ces requêtes sont transformées en jobs MapReduce.
Pour travailler, il suffit définir un schéma qui est associé aux données. Ce schéma donne les noms et types des colonnes,
et structure les informations en tables exploitables par HiveQL.
105
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
Le début est classique, sauf les contraintes d’intégrité : il n’y en a pas. La fin de la requête indique que les données
sont dans un fichier CSV. Voyons d’abord les types des colonnes.
Les directives situées après le schéma indiquent la manière dont les données sont stockées dans le fichier CSV. Ce sont :
• FIELDS TERMINATED BY ';' : il y a un ; pour séparer les champs
• COLLECTION ITEMS TERMINATED BY ',' : il y a un , entre les éléments d’un ARRAY
• MAP KEYS TERMINATED BY ':' : il y a un : entre les clés et les valeurs d’un MAP
• LINES TERMINATED BY '\n' : il y a un \n en fin de ligne
• STORED AS TEXTFILE : c’est un CSV.
NB: le problème est que Hive déplace le fichier CSV dans ses propres dossiers, afin de ne pas dupliquer les données.
Sinon, on peut écrire CREATE EXTERNAL TABLE ... pour empêcher Hive de capturer le fichier.
On peut aussi charger un fichier local (pas HDFS) :
Le fichier est alors copié sur HDFS dans les dossiers de Hive.
106
IUT de Lannion P. Nerzic
Dept Informatique Outils Hadoop pour le Big Data 2017-18
La clause SERDEPROPERTIES (serialisation/désérialisation) associe les noms des colonnes HBase à ceux de la table
Hive.
La directive envoie les n-uplets concernés sur une seule machine afin de les comparer plus rapidement pour établir le
classement.
107