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
- [HDFS Architecture]
- [HDFS operations made easy]
- [The Hadoop Distributed File System]. Shvachko et al. MSST’10.
- [The Hadoop Distributed Filesystem: Balancing Portability and Performance]. Shafer et al. ISPASS’10.
- [The Google File System]. Ghemawat et al. SOSP 2003.
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
- [Why you should care about data layout in the filesystem], Spark Summit 2017
- [File Format Benchmarks – Avro, JSON, ORC, & Parquet]
- [Benchmarking Apache Parquet: The Allstate Experience] (blog, comparison between avro and parquet)
- [Thrift vs Protocol Buffers vs Avro – Biased Comparison] (slides)
- [Compression Options in Hadoop – A Tale of Tradeoffs]
[Parquet]
- [The future of column-oriented data processing with Arrow and Parquet], nov. 2016
- [How to use Parquet as a basis for ETL and analytics] (slides)
- [Modern query processing with columnar formats]
- [Using Parquet and Scrooge with Spark]
- [Announcing Parquet 1.0: Columnar Storage for Hadoop]
- [Parquet – Data I/O – Philadelphia 2013] (slides)
- [Dremel made simple with Parquet]
- [Understanding how Parquet integrates with Avro, Thrift and Protocol Buffers]
- [Dremel: Interactive Analysis of Web-Scale Datasets]. Sergey Melnik and al. VLDB 2010.
[Avro]
- [Big data serialization using Apache Avro with Hadoop]
- [Three Reasons Why Apache Avro Data Serialization is a Good Choice for OpenRTB]
Quelques petits retours d’expérience sur ce sujet, qui est extrêmement important quand on traite de grandes volumétries de données :
Le file system GlusterFS n’est pas du tout fait pour faire de nombreuses IO, même avec Hadoop Spark. Nous avons eu pas mal de soucis avec sur le projet GAIA au CNES.
Pour la sérialisation, il faut éviter au maximum de reposer sur la serialisation Java de base (ce qu’est en réalité un Gbin de GAIA), ou même sur des équivalents plus performant comme Kryo par exemple. En utilisant les Dataset de Spark, on est de toute manière compatible avec les formats comme Parquet. De même les formats textes (CSV, Json) sont intéressant pour l’interfaçage entre applications, mais pas vraiment pertinent pour des traitements efficaces et un stockage optimisé.