Apache Arrow 3.0 est disponible avec l'amélioration de l'authentification en C++/Java/Python
et l'implémentation du type de données Decimal256 en C++ et Java

Apache Arrow est une plateforme de développement pour l'analyse en mémoire. Elle contient un ensemble de technologies qui permettent aux grands systèmes de données de traiter et de déplacer rapidement les données. Apache Arrow propose un format de données en mémoire multilangage, multiplateforme et en colonnes pour les données. Il élimine le besoin de sérialisation, car les données sont représentées par les mêmes octets sur chaque plateforme et langage de programmation. Ce format commun permet le transfert de données sans copie dans les systèmes Big Data, afin de minimiser les performances du transfert de données.

Base de données en mémoire et caractéristiques d'Apache Arrow

Une base de données dite « en mémoire » (in-memory), ou IMDB (In Memory DataBase), ou encore MMDB (Main Memory DB), désigne une base de données dont les informations sont stockées en mémoire centrale afin d'accélérer les temps de réponse. Une IMDB constitue un type de base de données analytique, un système qui stocke des données historiques portant sur des mesures destinées à des applications BI/BA (Business Intelligence/Business Analytics), généralement dans le cadre d'un entrepôt ou d'un magasin de données.

Nom : apache-arrow-and-python-the-latest-5-638.jpg
Affichages : 229348
Taille : 22,0 Ko

Ces systèmes permettent aux utilisateurs d'exécuter des requêtes et de générer des rapports sur les informations renfermées. Celles-ci sont régulièrement mises à jour pour intégrer les données transactionnelles récentes issues des systèmes opérationnels d'une entreprise. Outre le fait qu'elle permet des temps de réponse extrêmement courts, l'analytique en mémoire vive réduit, voire élimine, le recours à l'indexation des données et au stockage de données préagrégées dans des tables d'agrégats ou des cubes OLAP. Cette capacité diminue les coûts informatiques et accélère la mise en œuvre d'applications BI/BA.

Comme souligné plus haut, Apache Arrow contient un ensemble de technologies qui permettent aux systèmes Big Data de traiter et de déplacer rapidement les données. Il spécifie un format de mémoire en colonnes standardisé indépendant du langage pour les données plates et hiérarchiques, organisé pour des opérations analytiques efficaces sur du matériel moderne. Apache Arrow propose un format de stockage commun sans frais généraux pour de nombreux systèmes Big Data et voudrait devenir un nouveau standard pour le traitement des données en mémoire orienté colonnes.

Le projet a été soutenu dès le départ par de nombreux projets Big Data tels que Cassandra, Drill, HBase, Spark et Storm répertoriés sur Apache (notons que des projets en dehors d'Apache tel que Pandas ont également soutenu son développement). Apache Arrow 3.0.0 vient d'être publiée avec de nombreuses nouvelles fonctionnalités pour la base de données. Celle-ci couvre plus de 3 mois de travail de développement et comprend 666 problèmes résolus provenant de 106 contributeurs distincts. Voici ci-dessous un aperçu de ce dont il s'agit dans cette version.

Arrow Columnar Format

Arrow Columnar Format est un composant d'Apache Arrow et constitue une représentation en mémoire standard et efficace de divers types de données, simples ou imbriquées. En d'autres termes, il comprend une spécification de la structure des données en mémoire, la sérialisation des métadonnées, et un protocole de sérialisation et de transport des données génériques. Il offre des garanties de performance analytique et de localisation des données en échange d'opérations de mutation comparativement plus coûteuses.

Avec la sortie d'Apache Arrow 3, le type de données Decimal256, qui était déjà pris en charge par la spécification du format en colonnes Arrow, est maintenant implémenté en C++ et Java.

Arrow Flight

Un service "flight" est un point d'extrémité permettant de récupérer ou de stocker des données Arrow. Il peut exposer un ou plusieurs points d'extrémité prédéfinis auxquels on peut accéder à l'aide du protocole Arrow Flight. De plus, service "flight" peut exposer un ensemble d'actions qui sont disponibles. Dans Apache Arrow 3, l'authentification en C++/Java/Python a été révisée, permettant des méthodes d'authentification plus souples et l'utilisation d'en-têtes standard. La prise en charge des cookies a également été ajoutée.

Les implémentations C++/Java sont désormais plus permissives lors de l'analyse des messages afin de mieux interagir avec les autres implémentations de Flight. Une implémentation de Flight de base pour C#/.NET a été ajoutée.

La bibliothèque C++

  • la réserve de mémoire par défaut peut maintenant être modifiée à l'exécution en utilisant la variable d'environnement "ARROW_DEFAULT_MEMORY_POOL". La variable d'environnement est inspectée au démarrage du processus. Ceci est utile pour essayer de diagnostiquer les problèmes de consommation de mémoire avec Arrow ;
  • des itérateurs de type STL sont maintenant fournis sur des tableaux concrets. Ils sont utiles pour les tâches critiques non performantes, par exemple les tests ;
  • il est maintenant possible de concaténer des tableaux de dictionnaires avec des dictionnaires inégaux. Les dictionnaires sont unifiés lors de la concaténation, pour les types de données pris en charge ;
  • les threads d'un pool de threads sont désormais générés paresseusement selon les besoins pour les tâches en attente, jusqu'à la capacité configurée. Ils étaient auparavant générés dès la création du pool de threads.

La couche de calcul

À titre de rappel, dans Apache Arrow, les fonctions représentent des opérations de calcul sur des entrées de types éventuellement différents. En interne, une fonction est mise en œuvre par un ou plusieurs "noyaux", selon les types d'entrées concrets (par exemple, une fonction ajoutant des valeurs à partir de deux entrées peut avoir des noyaux différents selon que les entrées sont intégrales ou à virgule flottante). Dans Apache Arrow 3, les changements à ce niveau incluent :

  • les fonctions sont stockées dans un registre global des fonctions où elles peuvent être recherchées par leur nom ;
  • des fonctions de calcul pour le traitement des chaînes de caractères ont été ajoutées : d'une part le fractionnement sur les espaces (saveurs ASCII et Unicode) et le fractionnement sur un motif et d'autre part, le découpage des caractères ;
  • le comportement des fonctions de calcul "index_in" et "is_in" avec des zéros a été modifié pour des raisons de cohérence ;
  • des noyaux de tri à colonnes multiples sont désormais disponibles pour les tableaux et les lots d'enregistrement ;
  • les performances du filtrage des tables ont été considérablement améliorées ;
  • des arguments scalaires sont maintenant acceptés pour un plus grand nombre de fonctions de calcul ;
  • les fonctions de calcul "quantile" et "is_nan" ont été ajoutées pour les données numériques ;
  • les fonctions d'agrégation "any" et "all" ont été ajoutées pour les données booléennes.

Les ensembles de données

  • la hiérarchie des expressions s'est simplifiée pour devenir une enveloppe autour de littéraux, de références de champs ou d'appels à des fonctions nommées. Cela permet d'utiliser n'importe quelle fonction de calcul tout en filtrant sans passer par la case départ ;
  • les statistiques de parquet sont analysées paresseusement dans "ParquetDatasetFactory" et "ParquetFileFragment" pour un temps de construction plus court.

CSV

  • la conversion des colonnes de chaînes est désormais plus rapide grâce à une validation UTF-8 plus rapide des petites chaînes ;
  • la conversion des colonnes à virgule flottante est maintenant plus rapide grâce à des routines de conversion optimisées de chaînes de caractères en doubles ;
  • l'analyse des horodatages ISO8601 est maintenant plus libérale : les zéros de fin peuvent être omis dans la partie fractionnaire ;
  • Correction d'un bug où la détection de zéros pouvait donner de mauvais résultats sur certaines plateformes ;
  • ajout d'une inférence de type pour les colonnes Date32 pour les valeurs sous la forme AAAA-MM-JJ.

Feather

  • correction de la lecture des fichiers Feather compressés écrits avec Arrow 0.17

Filesystem layer

  • les parcours récursifs des arbres S3 bénéficient désormais d'une implémentation parallèle, où les lectures de plusieurs annuaires enfants sont désormais émises simultanément ;
  • amélioration de la détection des répertoires vides afin de tenir compte des différences entre les implémentations Amazon et Minio S3.

Flight RPC

  • les adresses d'hôtes IPv6 sont désormais prises en charge.

IPC

  • il est maintenant possible d'émettre des deltas de dictionnaire lorsque cela est possible en utilisant le rédacteur de flux de la CIB. Ceci est régi par une nouvelle variable dans la classe IpcWriteOptions ;
  • il est maintenant possible de lire des tables plus larges, qui auparavant échouaient parce qu'elles atteignaient une limite lors de la vérification des Flatbuffers.

Parquet

  • correction de la lecture des colonnes de Parquet comprimées LZ4 émises par l'implémentation Java Parquet ;
  • correction d'un bogue où l'écriture de plusieurs lots de chaînes imbriquées annulables dans Parquet ne permettait pas d'écrire des données en lots après le premier ;
  • le type de données Decimal256 peut être lu et écrit dans Parquet ;
  • les données LargeString et LargeBinary peuvent maintenant être écrites dans Parquet.

C#

  • le paquet .NET a ajouté un support initial pour les clients et serveurs Arrow Flight. Cette prise en charge est assurée par deux nouveaux paquets NuGet : Apache.Arrow.Flight (client) et Apache.Arrow.Flight.AspNetCore (serveur) ;
  • correction d'un problème où ArrowStreamWriter n'écrivait pas les métadonnées de schéma sur les flux Arrow.

Julia

  • Apache Arrow 3 est la première version à inclure officiellement une implémentation pour le langage Julia. L'implémentation de Julia pure inclut le support d'une large couverture de la spécification du format.

Python

  • le support pour Python 3.9 a été ajouté, et le support pour Python 3.5 a été supprimé ;
  • le support pour la construction de paquets manylinux1 a été supprimé. PyArrow continue à être disponible sous forme de roues manylinux2010 et manylinux2014 ;
  • la version minimale requise pour NumPy est maintenant la 1.16.6. Notez que lors de la mise à jour de NumPy vers la version 1.20, vous devez également mettre à jour PyArrow vers la version 3.0.0 pour assurer la compatibilité, car cette version de PyArrow corrige un problème de compatibilité avec NumPy 1.20 ;
  • les fonctions de calcul sont maintenant automatiquement exportées du C++ vers le module de calcul pyarrow.com, et elles ont des chaînes de caractères correspondant à leur définition C++ ;
  • une méthode iter_batches() est maintenant disponible pour la lecture itérative d'un fichier Parquet ;
  • d'autres pools de mémoire (tels que mimalloc, jemalloc ou le pool de mémoire basé sur C malloc) sont maintenant disponibles en Python ;
  • correction d'un blocage potentiel lors de l'importation de pandas à partir de plusieurs threads.

R

  • cette version contient de nouvelles fonctionnalités pour l'habillage Flight RPC, une meilleure prise en charge de la sauvegarde des métadonnées R (y compris les données spatiales sf) dans les fichiers Feather et Parquet, plusieurs améliorations significatives de la vitesse et de la gestion de la mémoire, et de nombreuses autres améliorations.

Ruby

  • dans le binding Ruby, le support de Decimal256 et de Arrow::FixedBinaryArrayBuilder sont ajoutés ainsi que C GLib.

C GLib

Dans Apache Arrow 3, C GLib se compose de nombreuses nouvelles fonctionnalités, dont :

  • un tableau en morceaux, un lot d'enregistrements, et une table supportant la fonction sort_indices ainsi qu'un tableau. Ces fonctions incluent la prise en charge du tableau pour spécifier l'option de tri. En outre, garrow_array_sort_to_indices a été renommé en garrow_array_sort_indices et le nom précédent a été déprécié ;
  • GArrowField prend en charge les fonctions de traitement des métadonnées. GArrowSchema prend en charge la fonction garrow_schema_has_metadata() ;
  • GArrowArrayBuilder permet d'ajouter un seul zéro, plusieurs zéros, une seule valeur vide et plusieurs valeurs vides. GArrowFixedSizedBinaryArrayBuilder est désormais pris en charge ;
  • les types décimal et extension 256 bits sont désormais pris en charge. Le module de système de fichiers prend en charge les systèmes de fichiers Mock, HDFS, S3. Le module Dataset prend en charge les formats de fichiers CSV, IPC et Parquet ;

Rust

Le développement de arrow crate a été axé sur quatre aspects principaux :

  • rendre crate utilisable en Rust stable ;
  • correction de bogues et suppression de codes dangereux ;
  • étendre les fonctionnalités pour respecter les spécifications ;
  • améliorer les performances des noyaux existants.

Rust stable

  • toutes les crates du projet, y compris arrow, le parquet et la fusion de données sont maintenant construits avec la version stable de Rust par défaut. Nightly/unstable Rust est toujours nécessaire lorsque la fonction SIMD est activée.

Parquet Arrow writer

  • le Parquet Writer pour les tableaux Arrow est maintenant disponible, permettant aux programmes Rust de lire et d'écrire facilement les fichiers Parquet et facilitant l'intégration dans l'écosystème global Arrow. Le reader et le writer incluent le support des types de base et imbriqués (List, Dictionary, Struct) ;

First Class Arrow Flight IPC

  • cette version de l'implémentation de l'IPC Arrow Flight dans Rust est devenue suffisamment complète pour participer aux tests réguliers d'intégration interlangage, garantissant ainsi que les applications Rust écrites avec Arrow peuvent interagir avec le reste de l'écosystème.

Performance

De nombreuses améliorations de performance ont été apportées à cette version dans tous les domaines. Cela inclut à la fois les opérations du noyau, comme take, filter et cast, ainsi que des parties plus fondamentales comme la comparaison des bits et la lecture et l'écriture en CSV.

Autres améliorations

  • ajout d'un support pour la date et l'heure sur FFI ;
  • prise en charge du type binaire sur FFI ;
  • prise en charge des tableaux de taille i64 pour "prendre" le noyau ;
  • prise en charge du type décimal i128 ;
  • ajout d'un support pour le cast de string en date ;
  • ajout d'une API permettant de créer des tableaux à partir de tableaux existants (par exemple pour joindre, fusionner-trier, concaténer) ;
  • la fonction de simulation est désormais également disponible sur aarch64.

Modifications de l'API

  • BooleanArray n'est plus un PrimitiveArray ;
  • ArrowNativeType n'inclut plus le bool puisque le type booléen des flèches est représenté par bitpacking ;
  • Plusieurs méthodes de tamponnage sont désormais infaillibles au lieu de renvoyer un résultat ;
  • DataType::List contient désormais un champ permettant de suivre les métadonnées relatives aux éléments contenus ;
  • PrimitiveArray::les méthodes raw_values, values_slice et values ont été remplacées par une méthode values retournant une tranche ;
  • Tampon::data et raw_data ont été renommés en as_slice et as_ptr ;
  • MutableBuffer::data_mut et freeze ont été renommés en as_slice_mut pour être plus cohérents avec les conventions de nommage de stdlib ;
  • le paramètre de type générique pour BufferBuilder a été modifié, passant de ArrowPrimitiveType à ArrowNativeType.


Source : Note de version d'Apache Arrow 3

Et vous ?

Que pensez-vous de cette nouvelle version d'Apache Arrow ?

Voir aussi

Big Data : la plateforme de développement pour l'analyse in-memory Apache Arrow 1.0.0 est disponible et s'accompagne de nombreuses améliorations

OpenOffice.org célèbre son 20e anniversaire. À cette occasion, LibreOffice demande à Apache OpenOffice de le rejoindre, rappelant qu'OpenOffice n'a pas sorti de version majeure depuis six ans

Nginx est maintenant le serveur web le plus utilisé par les sites les plus fréquentés au monde devant Apache et Microsoft IIS, selon W3Tech

Une alternative française à Palantir pour aider la France à prévenir d'éventuelles attaques terroristes grâce au Big Data pourrait être implémentée en deux ans, selon le PDG de Thalès