Vous êtes sur la page 1sur 4

Issat Gafsa Framework BD

TD1: Spark

Exercice 1: Code Scala

On suppose qu’on dispose d’un fichier mesures .txt qui contient les informations suivantes:
7,2010,04,27,75
12,2009,01,31,78
41,2009,03,25,95
Chaque ligne correspond à des mesures de températures. Interpreter le code suivant

Dr. Hrizi 1/4 2023/2024


Issat Gafsa Framework BD

le code suivant

Exercice 2: Code Python

Interpréter le code suivant:

sortByKey(False) permet de trier le RDD par clés (ordre décroissant).

Exercice 3: Analyse des Logs File

L'une des utilisations les plus courantes de Spark est l'analyse et le traitement des fichiers journaux
(log). Dans cet exercice on propose d’analyser des fichiers logs GHTorrent. GHTorrent fonctionne
en suivant la chronologie des événements Github, puis en récupérant tous les éléments liés à chaque
événement de manière récursive et exhaustive. Voici un extrait de ce à quoi ressemble le journal
GHTorrent:

DEBUG, 2017-03-23T10:02:27+00:00, ghtorrent-40 -- ghtorrent.rb: Repo EFForg/https-everywhere exists


DEBUG, 2017-03-24T12:06:23+00:00, ghtorrent-49 -- ghtorrent.rb: Repo Shikanime/print exists
INFO, 2017-03-23T13:00:55+00:00, ghtorrent-42 -- api_client.rb: Successful request. URL: https://
api.github.com/repos/CanonicalLtd/maas-docs/issues/365/events?per_page=100, Remaining: 4943, Total:
88 ms
WARN, 2017-03-23T20:04:28+00:00, ghtorrent-13 -- api_client.rb: Failed request. URL: https://
api.github.com/repos/greatfakeman/Tabchi/commits?sha=Tabchi&per_page=100, Status code: 404, Status:
Not Found, Access: ac6168f8776, IP: 0.0.0.0, Remaining: 3031
DEBUG, 2017-03-23T09:06:09+00:00, ghtorrent-2 -- ghtorrent.rb: Transaction committed (11 ms)
DEBUG, 2017-03-23T09:06:09+00:00, ghtorrent-2 -- ghtorrent.rb: Transaction committed (11 ms)
ERROR, 2017-03-23T20:04:28+00:00, ghtorrent-13 -- api_client.rb: Failed request. URL: https://
api.github.com/repos/greatfakeman/Tabchi/commits?sha=Tabchi&per_page=100, Status code: 404, Status:
Not Found, Access: ac6168f8776, IP: 0.0.0.0, Remaining: 3031

Il existe 4 niveaux de journalisation: DEBUG, INFO, WARN, ERROR (séparés par,)

1. Implémenter un programme Spark « CountErrors », qui devrait compter le nombre d'erreurs


dans un fichier journal GHTorrent.
2. On suppose maintenant qu’on a un log qui génère des lignes indiquants des erreurs mais on
connait pas l’emplacement du mot « «error », en plus l’écriture de « error » peut varier, ca peut
être en majuscule ou en minuscule. On considère que chaque ligne qui contient la chaîne "error"
compte comme une erreur. Implémenter le code Spark qui permet de déterminer le nombre
d’erreur dans un tel fichier log.

Dr. Hrizi 2/4 2023/2024


Issat Gafsa Framework BD

Exercice 4:

On suppose qu’on a ce RDD:

val rdd1 = sc.parallelize(Seq("Roses are red", "Violets are


blue" , "Sugar is sweet", " and so are you " ..)..)

3. Que permet de faire ce code? Existe-t-il une autre manière pour faire la même chose que fait ce
code?
4. Ecrire un code Spark qui permet de calculer, en premier lieu, le nombre de caractères de chaque
mot. Calculer également le nombre de caractères total (de tout le RDD).
Dans votre code, mettre en évidence les actions et les transformations.
5. Ecrire un code Spark qui devrait compter le nombre de fois ou il y’a le mot « are ».
Dans votre code, mettre en évidence les actions et les transformations.

Exercice 4: Inverser un graphe

Implémenter un programme Spark ReverseGraph qui doit inverser la direction des arêtes dans un
graphe orienté.

Une entrée possible est donnée sur la figure, où chaque élément de la séquence est une paire qui
attribue la liste des arêtes aux nœuds du graphique. Le résultat attendu est donné dans la figure 1b.
Pour chaque arête a->b dans l’entrée il y a un arête correspondant b-> a dans la sortie.

Exercice 5:
On considère un graphe de réseau social encodé dans un fichier texte.
• Une ligne du fichier est une liste d’identificateurs séparés par des virgules : A, B, C, D qui
signifie que A a pour amis B, C et D.
• L’ensemble des lignes du fichier décrivent les relations « a pour ami » du graphe. Ex :
A, B, C, D
B, A, D
Dr. Hrizi 3/4 2023/2024
Issat Gafsa Framework BD

C, A, D
D, A, B, C
• On supposera les relations symétriques : si on A, B alors on a B, A.

On souhaite obtenir la liste des amis communs à des couples d’individus :


(A, B), [D]
(A, C), [D]
(A, D), [B, C]
(B, C), [A, D]
(B, D), [A]
(C, D), [A]
On ne veut représenter chaque couple qu’une fois, et éviter de représenter le couple symétrique. Si
on présente les amis du couple (A, B), alors on ne représentera PAS le couple (B, A).

Dans un premier temps on va chercher à produire des paires clé-valeur représentant UN ami
commun à un couple d’individus.
Ex : ((A, D), B) signifiera que B est un ami commun à A et D. La clé est ici un couple.

1. Proposez une solution en Spark pour obtenir l’ensemble des paires clé-valeur (Couple, Ami) du
graphe à partir du fichier texte représentant le graphe.
2. Est-ce que votre solution génère des paires symétriques ?

Proposez maintenant une solution complète en Spark, pour obtenir la liste des amis communs des
couples d’individus (s’ils ont bien des amis communs) :
(A, B), [X1, X2, ... Xn] ….
1. Restez-vous bien en RDD jusqu’à la fin des traitements ?
2. Quels sont vos étapes Narrow et vos étapes Wide ?

Dr. Hrizi 4/4 2023/2024

Vous aimerez peut-être aussi