collect
sur des données volumineuses, car toutes les lignes du RDD sont renvoyéesCeci est une ancienne révision du document !
L'objectif de ce TP est de prendre en main Spark, un autre moteur de calcul distribué sur HDFS (entre autres).
Ce TP est à faire en binôme (les mêmes que pour le TP Hadoop).
Il est demandé de rendre un rapport décrivant le déroulement du TP et contenant en particulier le code commenté pour le lundi 14/11/2016 au soir sous forme d'un fichier pdf à déposer dans la case tomuss rendu_spark
.
Chaque binôme dispose d'une machine cloud (ip dans tomuus) pour exécuter des job Spark. La machine héberge un conteneur docker pour faire tourner une instance de la distribution Cloudera (cloudera-quickstart).
Ce mode de fonctionnement a les conséquences suivantes:
screen
, puis de lancer le conteneur depuis screen.root
de vorte machine cloud → penser à utiliser sudo
sudo docker cp le.fichier.a.copier cloudera:/
root
) a les droits pour exécuter des jobs spark et pour écrire dans HDFS
Lancer le conteneur (depuis screen
pour ne pas le perdre en cas d'interruption de la connexion, attention à copier toute la ligne):
sudo docker run --hostname=quickstart.cloudera --privileged=true -t -i --name cloudera cloudera/quickstart /usr/bin/docker-quickstart
Récupérer l'archive data.zip qui contient les fichiers de données.
Importer les données dans HDFS (dans le répertoire HDFS /home/root
) en conservant la structure de répertoires de l'archive.
Dans la suite de ce TP, on va reproduire sur Spark les requêtes des TPs (tp1 et tp2) précédents
Lire le tutoriel spark. Implémenter le compte de mots sur les fichiers du répertoire textes
lu dans le HDFS.
Remarques:
--master yarn
avec pyspark
(ou spark-shell
) pour que Spark accède au HDFS.
Reprendre les questions de calcul de statistiques pour chaque objet dans les sources (répertoire Source
) du tp1.
Calculer le résultat de la requête suivante:
SELECT object_id, COUNT(*), MAX(source_id), MIN(ra), MAX(ra), MIN(decl), MAX(decl) FROM SOURCE WHERE object_id IS NOT NULL GROUP BY object_id
Donner ensuite l'objet ayant le plus grand déplacement dans le ciel. Comme dans le TP Hadoop, on se contentera d'une approximation grossière du déplacement qui consistera en une distance euclidienne calculée à partir des valeurs extrémales de ra et decl calculées par le job précédent (dont la sortie sera ainsi utilisée pour ce job).
Remarques:
filter
;map
, ou flatMap
pour transformer chaque ligne en plusieurs résultats (renvoie une liste de résultats, les listes de chaque ligne étant concaténées les une autres);reduceByKey
.saveAsTextFile
(doc);reduce
.Reprendre la requête suivante issue du TP2 Hadoop:
SELECT o.objectId, COUNT(*) AS cnt, avg(flux_Gaussian) flxG_avg FROM SOURCE s JOIN Object o ON s.objectId = o.objectId WHERE earliestObsTime <= 50985.0 AND s.objectId IS NOT NULL GROUP BY o.objectId
Coder cette requête dans Spark. On pourra utiliser la transformation join
pour effectuer la jointure entre Source et Object.
collect
sur des données volumineuses, car toutes les lignes du RDD sont renvoyées