Introduction a zio-spark

Introduction

Dans cet article nous allons parler de Spark, de ZIO et de zio-spark

Dans un premier temps, nous allons nous interesser aux avantages et aux inconvénients d’utiliser Spark avec ZIO

Nous présenterons ensuite zio-spark, un lib qui vous permet d’utiliser Spark avec ZIO facilement.

Avantages d’utiliser Spark avec ZIO ?

D’une part, parce que ZIO nous facilite la vie.

En effet, l’injection de dépendance de ZIO - les ZLayers - nous permettent de gérer la Spark session sans effort dans toute notre application.

Aussi, les Fibers de ZIO permettent d’orchestrer des tâches parallèles sur un thread système sans bloquer ce dernier (https://zio.dev/version-1.x/datatypes/fiber/).

D’ailleurs, Spark effectue des calculs parallèles en distribuant les taches lorsqu’un job est lancé, mais Spark ne lance pas les jobs en parallèle (il faut lui dire de le faire) et c’est là que ZIO est interessant.

Figure 1 : Schéma représentant la distribution des Task pour un calcul parallèle

En somme, ZIO rend facile

  • L’injection de dépendances
  • La parallélisation de nos jobs
  • L’arrêt de nos jobs
  • Le fait de relancer nos Jobs en cas d’échec ou le fait de lancer des jobs à intervalles définis

Inconvénients d’utiliser Spark avec ZIO

Tout d’abord, on va se retrouver à faire pas mal de config pour notre projet Spark.

En effet, wrapper Spark dans des effets fonctionnels ZIO est un projet a part entière.

Ensuite, il y a la question de la main d’œuvre. Les développeurs qui connaissent à la fois ZIO et Spark ne sont pas légion.

Enfin, il va falloir faire suivre l’écosystème de Spark à ce choix technique.

Par exemple, si vous souhaitez utiliser Spark streaming ou Mllib, vous allez devoir wrapper vos effets vers des effets ZIO.

Que fait zio-spark ?

📯

Tout d’abord zio-spark nous évite les joies de faire un setup ZIO + Spark

Aussi, zio-spark nous permet de lancer plusieurs jobs dans la même spark session et ainsi faire meilleur usage de l’executor.

On réduit alors le temps global que prennent les jobs pour s’exécuter dans un pipeline (plutôt que de les lancer les uns après les autres, on exploite au mieux les ressources disponibles)

Tâchons de passer sur un petit exemple

Exemple

L’idée de notre exemple va être de lancer plusieurs jobs en parallèles

Notre petite application va lancer un Job Spark tâché de compter le nombre de mots dans un fichier texte et un autre job tâché compter le nombre de lettres dans ce même fichier.

L’avantage c’est que l’on va pouvoir lancer ces jobs en parrallele dans des fibers.

Le modèle des fibers est une modele de concurrence leger proposé par ZIO (qui ressemble aux virtual threads de loom) permettant de mieux orchestrer les executions (on a en plus de l’orchestratur des threads systeme un orchestrateur géré par le runtime de ZIO)

L’autre avantage c’est que l’on va pouvoir faire ça assez facilement grâce à zio-spark :

https://github.com/univalence/zio-spark/blob/master/examples/word-count/src/main/scala/example/WordCount.scala

Conclusion

Dans un prochain article → codegen