Archives de catégorie : Non classé

Optimisation de requêtes

Optimisation de requêtes

Catalyst

Catalyst est le nom de l’optimiseur de workflow de Spark.
Originellement créé pour [[SparkSQL]], Catalyst est également utilisé dans les Datasets et Dataframes.
Son rôle est de réécrire le plan d’exécution d’une requête (ou d’un workflow d’exécution) de façon à obtenir le maximum de performances.

Ressources complémentaires

Projet Tungsten

Le projet Tungsten vise a améliorer les performances de Spark en particulier en diminuant l’impact de la machine virtuelle Java et l’optimisation des structures de données utilisées.

Ressources complémentaires

Ressources complémentaires sur l’optimisation de requêtes sous Spark

Stockage des données

Stockage des données

Dans le contexte SparK/Hadoop, de nombreuses solutions techniques existent pour le stockage des données.
Selon les besoins, les données peuvent être conservées dans des fichiers sur un système de fichiers distribués (DFS)
ou gérées par un outil spécialisé ([Hive], [HBase], …).

Le choix entre toutes ces solutions va dépendre du profil d’accès aux données (accès aléatoire, lecture séquentielle, mises à jour, …),
des performances souhaitées pour les opérations importantes et de la richesse des fonctionnalités proposées.
Par exemple, un fichier Parquet dans HDFS fournira de bonnes performances pour les lectures séquentielles mais ne permettra pas les mises à jour.

La suite de cette page donne quelques éléments et des références vers ces technologies.

Comparaisons entre les systèmes/formats

Systèmes de fichiers distribués

Ces systèmes fournissent un accès de type fichier ainsi que de la tolérance aux pannes.
Dans le contexte Spark/Hadoop, le plus commun est HDFS.
D’autres alternatives comme [GlusterFS] ou [Ceph] existent et sont utilisées dans un contexte ”Cloud”.

HDFS

HDFS est le DFS proposé avec le framework Hadoop.
C’est une implémentation open source du ”Google File System”.
Il est bien adapté au stockage de gros fichiers.

Références

Comparaison

Systèmes de gestion de bases de données

De nombreux moteurs de stockage/interrogation existent dans l’écosystème Spark/Hadoop.
Les plus connus sont sans doute l’entrepôt de données [Hive] et le SGBD orienté colonne [HBase].

Une alternative intéressante en terme de performances est le projet [Apache Kudu].

Références

Sérialization et formats de fichiers

Les formats de sérialisation d’objets et fichiers sont très nombreux.
En dehors des très pratiques ”csv” et ”json”, il est nécessaire de se tourner vers des formats plus sophistiqués lorsqu’on recherche de la performance dans le contexte Spark/Hadoop.
Actuellement, les formats Avro, Parquet et ORC sont de bons candidats pour le stockage des données dans HDFS.

Le second choix qu’il est possible de faire à propos du stockage en fichiers concerne la technique de compression utilisée.
Selon le codec, l’efficacité en taux de compression et les performances en lecture ou écriture peuvent varier de façon importante.

Enfin, des formats spécialisés existent pour certaines applications ([Gbin] (Gaïa DPAC), [HDF5]).

Comparaisons

[Parquet]

[Avro]

[ORC]

Objectif de ce blog

Si vous avez déjà utilisé la technologie Spark, si vous développez des applications exploitant Spark, vous pourriez proposer un article décrivant l’utilisation que vous faîtes de Spark, de façon à susciter des échanges, des savoir-faire, des questionnements, des propositions.

 

Présentation de Spark

Présentation de Spark

Spark est un outil permettant de distribuer des calculs sur une ou plusieurs machines. Il se présente sous la forme d’une interface de programmation (API) disponible dans de nombreux langages (Scala, Java, Python, R). Il est lui-même écrit en langage Scala et son approche est basée sur la programmation fonctionnelle.

Spark peut être vue comme le successeur de Hadoop MapReduce car il en reprend les fondements (le paradigme Map/Reduce) et est capable d’utiliser les outils de distribution de calculs YARN ou MESOS et de stockage HDFS. Cependant, ses cas d’application sont beaucoup plus larges que MapReduce de par la flexibilité de son modèle de données (le RDD – Resilient Distributed Dataset). Ainsi, de nombreux cas d’application ont rapidement émergé en apprentissage statistique (machine learning) ou en traitement des graphes là où Hadoop MapReduce n’était pas du tout adapté.

Comparé à Hadoop MapReduce, Spark est généralement beaucoup plus rapide car il tente de garder les données manipulées en mémoire là où MapReduce effectue énormément de lectures et d’écritures disque.

A la manière de Hadoop, Spark manipule des *ensembles* de données pouvant être traitées séparément. L’exemple le plus typique est le comptage d’occurrences de chaque mot dans un texte : pour cette application, on peut découper le texte à l’infini (par page, par ligne, par phrase, …), chaque sous-ensemble étant composé de mots. Chacun de ces sous-ensembles peut être traité séparément, quel que soit sa taille, et les comptages partiels peuvent ensuite être agrégés pour obtenir le comptage final.

Historique de Spark

Spark a été développé à partir de 2009 à l’AMPLab [AMPLab de l’UC Berkeley] de l’UC Berkeley par un doctorant nommé Matei Zaharia.
En 2013, le code source a été cédé à la fondation Apache et en 2014 la version 1.0 est parue.
Dès cette année, Spark a battu MapReduce au benchmark de référence TeraSort[Benchmark Terasort] en étant jusqu’à 30x plus performant.

Les sections suivantes listent les ajouts notables survenus dans les différentes versions de Spark. Les améliorations de performances ne sont pas listées car elles sont une constante des différentes versions.

Modèles de données

Spark propose deux grandes familles de représentation des données :

  • les RDD, qui permettent de stocker des objets au sens classique (instances de classe Java, “case classes” Scala, objets Python, etc). Ces objets sont ensuite manipulés via des opérateurs ensemblistes type “map” ou “reduce”
  • les Datasets (ex-Dataframes) qui permettent de représenter des données tabulaires pour ensuite être manipulées soit via des commandes en SQL pur (ou leur équivalent en fonctions SparkSQL), soit via des opérations ensemblistes comme sur les RDD (depuis Spark 2.0)

En termes de fonctionnalités comme de performances, les Datasets sont beaucoup plus aboutis que les RDD à partir de Spark 2.0. Cependant, l’avantage des RDD est que l’on peut paralléliser et distribuer des structures de données d’un programme existant sans avoir à réécrire son modèle de données.

Ressources complémentaires

Moteur d’exécution et optimisation de requêtes

[Optimisation de requêtes]

Stockage des données

[Stockage des données].

API

Spark propose une interface pour les langages [Scala, Java, Python (pyspark)] et [R (SparkR)].

En plus des fonctionnalités de base, plusieurs extensions existent :

Ressources complémentaires

Tuning, configuration et déploiement

[Tuning, configuration et déploiement]

Ressources complémentaires

Vue d’ensemble

Apprendre Spark

Outils liés

Références