La version 2.4 d'Apache Spark est sortie fin octobre 2018. Cette version intègre de nouvelles fonctionnalités et son lot de correctifs. Ce qui inclut notamment la mise à jour des dépendances (Scala 2.12, Kafka 2.0), un support natif d'Avro, une amélioration du support de Kubernetes, de nouvelles opérations pour gérer les collections et autres types complexes en Spark SQL, une amélioration de l'API data source v2, ainsi que d'autres nouveautés.

Nous allons dans cet article passer en revue les nouveautés de la version 2.4. Nous verrons notamment que ces nouveautés apportent non seulement de meilleures performances, mais qu'elles offrent plus de flexibilités en termes de traitement des données.

Support de Scala 2.12

Spark 2.4 vient déjà avec le support très attendu de Scala 2.12. Cette version de Scala sortie en version stable il y a 2 ans a été mise à jour régulièrement : nous en sommes à la 2.12.7 depuis fin septembre (avec un bug fix spécifique pour Spark 2.4). Pour information, il est prévu que Scala 2.13 sorte prochainement en version stable.

Scala 2.12 inclut une meilleure intégration avec les nouveautés apportées avec Java 8 (correspondance directe entre trait côté Scala et interface côté Java, utilisation des types SAM, utilisation d'invokedynamic pour les lambda expressions), de nouvelles optimisations (inlining, allocations des closures, détection de code mort, suppression plus efficace des (un)boxing...) et pour ceux qui ont fait du typechecking leur chemin de croix cheval de bataille, la correction du bug SI-2712.

Vous trouverez plus de détails sur ces fonctionnalités sur le blog d'Ippon Technologies : partie 1, partie 2 et partie 3.

Spark sur Kubernetes

Depuis la version 2.3, les utilisateurs de Spark ont la possibilité d'utiliser Kubernetes comme orchestrateur, en alternative par rapport à Yarn, Mesos ou en mode standalone.

Le support de Kubernetes dans Spark permet aux développeurs de livrer des images Docker, à la place du traditionnel JAR déployé avec spark-submit. De plus, Kubernetes offre un grand nombre de facilités dans la gestion, l'orchestration et le monitoring d'un cluster, en le comparant avec Yarn. Il permet notamment la mise en place de quota sur les ressources du cluster, la gestion de namespace (pour avoir du multi-tenant sur le même cluster, par exemple), etc.

La version 2.4 de Spark ajoute d'autres possibilités. Tout d'abord, un support de PySpark (pour Python 2.x et 3.x) et un support de SparkR. Des templates de Dockerfile sont mis à disposition pour ces deux langages.

Un mode client est aussi proposé. Il s'agit de faciliter l'exécution d'outils interactifs, comme spark-shell ou les notebooks, depuis un pod géré par un cluster Kubernetes ou depuis une machine cliente hors du cluster Spark.

Support intégré d'Avro

Avro est un format binaire de sérialisation de données très utilisé dans le monde Big Data, avec Hadoop et Spark, mais en particulier avec Kafka pour les données temps réel.

Jusqu'à présent l'intégration d'Avro se faisait en passant par un addon mis à disposition par Databricks. Depuis la version 2.4 de Spark, Avro a été ajouté aux formats supportés par défaut (JSON, Parquet, JDBC, CSV, texte), en améliorant au passage les performances.

En plus de la lecture et l'écriture des données en Avro, deux fonctions sont mises à disposition pour Avro : from_avro et to_avro. Ces fonctions sont les équivalentes de from_jon et to_json. Elles permettent de respectivement lire (désencapsulation) et écrire des données Avro (encapsulation) dans les champs d'un dataframe.

Spark 2.4 supporte une version plus moderne d'Avro, la version 1.8.2. Cette version majeure d'Avro qui est apparue 2 ans après la version 1.7 (début 2016) a ajouté le support des types logiques(*), avec par défaut les décimales, les dates et les timestamps.

( Il s'agit d'une mécanique similaire à d'autres formats de sérialisation comme EDN avec les* tagged elements*.)*

Support de Kafka 2.0.0

La version du client Kafka est mis à jour et passe de la version 0.10.0.1 à la version 2.0.0.

Le support des nouvelles versions de Kafka permet la gestion des transactions de Kafka dans Spark Streaming [SPARK-25005]. Ce support permet de choisir de lire :