Koalas, quand Spark déclare sa flamme à Pandas !

Je vais vous parler d’un nouveau projet open source de Databricks portant le doux nom de Koalas.

Avant même de parler du projet en lui-même, nous allons voyager ensemble dans la jungle de la Data. Je vous propose une petite excursion dans la zone des Pandas, l’outil Python de manipulation et d’analyse de la donnée, de passer par la maison Apache Spark, framework de calcul distribué, et enfin de vous présenter les Koalas, librairie implémentant les API Pandas sur Spark.

Pandas

pandas
source : https://pandas.pydata.org/

Quelques lignes sur Pandas sont peut-être utiles alors je vais vous en parler ici.

Pandas est le premier pensionnaire de notre jungle, c’est une librairie open source Python de manipulation et d’analyse de données à plusieurs dimensions. Elle propose en particulier des structures de données et des opérations de manipulation de tableaux numériques et de séries temporelles. C’est une librairie très simple à utiliser et très simple à tester. Elle est soutenue par une communauté gigantesque et dispose d’un écosystème d’API pour la manipulation de la donnée tout aussi gigantesque. “Ce panda est géant !”

Pandas est parfaitement intégré aux librairies communes de visualisation de la donnée et de Machine Learning. Elle est devenue un standard pour tous les workloads de Machine Learning.

Le revers de la médaille est que cette librairie est conçue pour des lots de données qui tiennent entièrement en mémoire donc exit le Big Data à moins d’avoir des super-serveurs !

Spark/PySpark

spark
source : https://spark.apache.org/

Un petit mot sur Spark pour ne pas perdre tout le monde dans l’histoire : Spark est un outil permettant de traiter de larges volumes de données de manière distribuée.

Spark est devenu un standard dans les calculs à large échelle, il optimise les requêtes via Catalyst et optimise l’utilisation mémoire et CPU de ses workloads via Tungsten. Inutile de faire de la redite, vous trouverez tout ce que vous cherchez sur le site officiel de Spark si vous voulez aller plus loin !

Le lien avec Pandas ?
Les 2 outils permettent sensiblement la même chose : manipuler des dataframes. L’implémentation est différente : Pandas est mono-serveur quand Spark est distribué.
Autre point commun : Python. En effet, Spark propose une API en Python (PySpark) pour effectuer les transformations qui est devenu, au fil des années, très populaire ! Mais il y a un véritable fossé entre les APIs qu’offre la librairie Pandas et le  DSL PySpark ce qui rend difficile la migration entre Pandas et PySpark ou encore, comme dit dans l’introduction, l’accompagnement des Data Scientists à utiliser Spark.

Pourquoi m’y suis-je intéressé ?

Lorsque nous sommes Data Scientist ou que nous travaillons avec des Data Scientists, nous avons forcément entendu parler ou manipulé des dataframes Pandas. Via n’importe quel MOOC spécialisé ou au travers de ses études dans le domaine, nous sommes formés  à l’utilisation des dataframes Pandas.

Travaillant sur une plateforme dont le moteur principal de calcul est Spark, je rencontre une flopée de Data Scientists qui ne connaissent pas ou ne maîtrisent pas le framework.

Un dataframe Spark n’a rien en commun avec un dataframe Pandas. Lorsqu’un Data Scientist arrive en possession d’un Spark dataframe, sa première action est un “toPandas()” qui a le malheur de remonter toute la donnée, préalablement distribuée par Spark sur tous ses executors, au niveau d’un seul noeud (driver). Il effectue ensuite ses transformations et travaille sur ses modèles de machine learning préférés. Au niveau de Spark, cela se traduit par un gâchis de ressources et des grosses pertes en performance et rendement menant bien souvent à un crash du job. L’action suivante pour le Data Scientist, lassé d’attendre le filtrage sous-optimal de son dataframe Pandas, est une réduction de la quantité de données en entrée pour pouvoir travailler plus rapidement (via un take(1000) sur le dataframe Spark par exemple). Et là, il se retrouve à travailler sur un sous-ensemble de données non représentatif des données d’entrée construisant ainsi des modèles moins performants.

Nous, Data Engineer, avons alors passé énormément de temps à sensibiliser les Data Scientists à utiliser la puissance de Spark. Le problème est que le Domain Specific Language (DSL) Spark ne peut pas lutter avec la simplicité d’utilisation de Pandas.
Pour illustrer cela, voici un exemple du value_counts:

Databricks est alors arrivé avec le projet Koalas, potentielle solution à nos problèmes !

Koalas

koalas
source : https://github.com/databricks/koalas

Voici le dernier venu de la jungle (composée de Pandas, d’étincelles et de koalas … Ce n’est pas banal !).

Koalas est une librairie open source développée par Databricks released en mars 2019 (en version 0.0.5). Elle implémente les API Pandas pour Apache Spark. Elle unifie les API Pandas et Spark mais Pandas first (si une même API existe sur Pandas et Spark, Koalas exposera la transformation que fait originellement Pandas plutôt que Spark) afin de rendre efficace Pandas dans la jungle du Big Data.

Koalas maintient la compatibilité avec Spark et Pandas via la classe DataFrame (pouvant prendre en paramètre un dataframe Pandas ou Spark) et les méthodes to_pandas et to_spark permettant de transformer le dataframe Koalas en dataframe Pandas ou Spark.

Performances

Comme nous pouvions nous y attendre, les performances vis-à-vis de Pandas sont excellentes. Logique me direz-vous, puisqu’elle profite de la puissance offerte par Spark.

L’énorme avantage est, bien entendu, de pouvoir utiliser Spark sans avoir à apprendre une nouvelle API. Ils peuvent profiter pleinement des automatismes acquis en formation en apprenant à utiliser Pandas.

Comme pour Spark, les évaluations sur Koalas sont lazy. C’est à dire que les opérations sur les données ne sont lancées que sur certaines commandes. La donnée n’est chargée en mémoire que lorsqu’on en a réellement besoin. Les gros avantages à cela sont :

  • L’augmentation de la vitesse d’exécution de notre algorithme puisque nous ne chargeons pas en mémoire tous les états intermédiaires de nos données (seulement quand nous en avons besoin) ;
  • L’optimisation de nos algorithmes. Koalas profite des optimisations offertes par Tungsten et Catalyst ;
  • La réduction de la complexité des opérations. Les deux principales complexités dans les opérations sont spatiales et temporelles. L’évaluation lazy de Koalas permet de réduire les deux vu que CHAQUE opération n’est pas exécutée (sauf si elle est déclenchée) et la donnée n’est chargée en mémoire que lorsque nous en avons besoin.

Il faudra en tenir compte quand nous travaillons avec Koalas.

Facilité d’utilisation

Du point de vue de l’utilisation du package, vous trouverez ici un article évoquant les similitudes entre Pandas et Koalas. ‘import databricks.koalas as kd’ et le tour est joué. A terme (une fois toutes les API Pandas portées dans Koalas), si le Data Scientist a fait des tests avec Pandas dans son Jupyter notebook en local, il n’aura plus qu’à modifier son ‘import pandas as pd’ en ‘import databricks.koalas as pd’ et aucune autre modifications sur son code ne sera nécessaire.
Koalas est “Community driven”. Les avantages de l’open source !

Support / Communauté

Comme tout projet open source, il existe un github avec gestion de tickets et un forum pour la communauté. Databricks a mis à disposition pour la communauté un guide pour contribuer au projet. A ce jour, nous comptons presque 40 contributeurs, plus de 800 commits qui ont participé à 29 releases.

Les fonctions Pandas communes ont été implémentées dans Koalas.
Cela représente :

  • 60% des API Dataframe/Series
  • 60% des API DataframeGroupBy/SeriesGroupBy
  • 15% des API Index/MultiIndex
  • les fonction spécifiques to_datatime, get_dummies, …
  • 80% des fonctions relatives à la représentation visuelle (plot)

Il reste encore du travail mais la communauté est active !

Limitations / Préoccupations

Support des librairies Python

Certaines librairies Python faisant partie de l'écosystème d’un Data Scientist ne sont pas supportées. Il faudra alors passer par Pandas pour :

  • les librairies spécifiques de machine learning (scikit-learn, keras, …). Pour contourner ce problème, nous pourrons créer les modèles de Machine Learning et utiliser MLflow pour load() et predict() ;
  • les librairies de visualisation. Uniquement matplotlib est supportée. Dès que le Data Scientist voudra utiliser sa librairie de visualisation préférée, il faudra passer en Pandas.

Ou est la méthode apply ?

Quand on travaille avec Pandas, on a été, au moins une fois, frustré de la lenteur de la commande apply() qui applique une User Defined Function (UDF) à toutes les lignes ou colonnes de mon dataframe. Vu que Pandas est monon-serveur, on peut s’y attendre ! Koalas, à ce jour, n’implémente toujours pas cette API de la classe Dataframe. Pourtant Spark est taillé pour ça. Ne désespérons pas, un ticket existe et la communauté active !

Performances : Koalas vs PySpark

Il existe forcément un overhead entre Koalas et Spark. Pour une opération unique, les performances seront égales mais lorsque nous allons coder un algorithme complet (enchaînant les opérations) en utilisant Koalas, nous pourrions presque toujours trouver un code Spark plus optimal.

Ordre

Une des grosses différences entre Spark et Pandas est le fait que Spark ne maintient pas l’ordre des lignes dans un dataframe. Cela demandera alors de forcer des orderBy pour retrouver un traitement identique à Pandas.

Et le calcul distribué dans tout ça ?

Une des grosses limitations que j’y vois également est l’apprentissage lié au calcul distribué. En effet, abstraire l’utilisation de Spark masque l’aspect distribution du calcul et la problématique de performance qui en est liée. Un exemple simple est le shuffle. Quand nous utilisons Pandas sur une machine unique, joindre des dataframes ou les ordonner n’est jamais un problème. A partir du moment où nous utilisons Spark et nous faisons donc du calcul distribué sur plusieurs machines, ces opérations nécessitent de faire transiter les données entre les workers (shuffle) ce qui représente un coût très important. L’expérience dans le framework sera toujours nécessaire pour écrire du code performant !
Nous pourrons ajouter à cela, la difficulté dans la lecture des plans d’exécution, les problèmes de data skew etc.

Conclusion

C’est certainement une des évolutions que j’attendais pour faire le lien entre les ingénieurs Data et les Data Scientists. Le projet est très prometteur et très suivi par la communauté, il semble que je n’étais pas le seul à l’attendre !

Nous pointerons du doigt certaines limitations qui pourraient rebuter certains utilisateurs assidus de Pandas.

Attention, par contre, Spark semble à la portée de tout utilisateur de Python ou Pandas via Koalas, mais ce n’est pas si simple ! Koalas n’apprendra pas aux utilisateurs de Pandas à utiliser Spark mais c’est un grand pas vers l’unification de ces deux mondes que sont la Data Science et le Data Engineering en ne parlant que d’un seul framework de calcul commun. Mon intérêt à cette technologie ne s’arrête pas là, je ne manquerai pas de vous tenir informés de toutes les nouveautés sur ce sujet.