Apache Flink vs Apache Spark

Si vous regardez cette image avec une liste d’outils de big data, il peut sembler que toutes les niches possibles dans ce domaine sont déjà occupées. Avec une telle concurrence, il devrait être très difficile de proposer une technologie révolutionnaire.

Les créateurs d’Apache Flink ont une pensée différente à ce sujet. Il a commencé comme un projet de recherche appelé Stratosphere. Stratosphere a été forké, et ce fork est devenu ce que nous connaissons sous le nom d’Apache Flink. En 2014, il a été accepté comme projet Apache Incubator, et quelques mois plus tard, il est devenu un projet Apache de premier niveau. Au moment où nous écrivons ces lignes, le projet compte près de douze mille commits et plus de 300 contributeurs.

Pourquoi une telle attention ? C’est parce qu’Apache Flink a été qualifié de framework de traitement de big data de nouvelle génération et qu’il a suffisamment d’innovations à son actif pour remplacer Apache Spark et devenir le nouvel outil de facto pour le traitement par lots et en flux.

Devriez-vous passer à Apache Flink ? Devriez-vous rester avec Apache Spark pendant un certain temps ? Ou Apache Flink n’est-il qu’un nouveau gadget ? Cet article tentera de vous donner des réponses à ces questions et à d’autres.

À moins que vous n’ayez vécu sous une roche au cours des deux dernières années, vous avez entendu parler d’Apache Spark. Il semble que chaque système moderne qui fait n’importe quel type de traitement de données utilise Apache Spark d’une manière ou d’une autre.

Pendant longtemps, Spark était le dernier et le meilleur outil dans ce domaine. Il offrait des fonctionnalités impressionnantes par rapport à ses prédécesseurs, telles que :

  • Vitesse impressionnante : il est dix fois plus rapide qu’Hadoop si les données sont traitées sur un disque et jusqu’à 100 fois plus rapide si les données sont traitées en mémoire.
  • Modèle de graphe acyclique dirigé plus simple : Au lieu de définir vos tâches de traitement de données en utilisant le cadre rigide MapReduce, Spark permet de définir un graphe de tâches qui peut mettre en œuvre des algorithmes complexes de traitement de données
  • Traitement en flux : Avec l’avènement de nouvelles technologies telles que l’Internet des objets, il ne suffit pas de traiter une énorme quantité de données. Désormais, il faut traiter une énorme quantité de données au fur et à mesure qu’elles arrivent en temps réel. C’est pourquoi Apache Spark a introduit le traitement de flux qui permet de traiter un flux potentiellement infini de données.
  • Riche ensemble de bibliothèques : En plus de ses fonctionnalités de base, Apache Spark fournit de puissantes bibliothèques pour l’apprentissage automatique, le traitement des graphes et l’exécution de requêtes SQL.

Pour avoir une meilleure idée de la façon dont vous écrivez des applications avec Apache Spark, regardons comment vous pouvez mettre en œuvre une application simple de comptage de mots qui compterait combien de fois chaque mot a été utilisé dans un document texte :

// Read fileval file = sc.textFile("file/path")val wordCount = file // Extract words from every line .flatMap(line => line.split(" ")) // Convert words to pairs .map(word => (word, 1)) // Count how many times each word was used .reduceByKey(_ + _)

Si vous connaissez Scala, ce code devrait sembler simple et est similaire au travail avec des collections régulières. Tout d’abord, nous lisons une liste de lignes à partir d’un fichier situé dans « file/path ». Ce fichier peut être soit un fichier local, soit un fichier dans HDFS ou S3.

Puis, chaque ligne est divisée en une liste de mots en utilisant la méthode flatMap qui divise simplement une chaîne de caractères par le symbole espace. Ensuite, pour mettre en œuvre le comptage des mots, nous utilisons la méthode map pour convertir chaque mot en une paire où le premier élément de la paire est un mot du texte d’entrée et le second élément est simplement un nombre un.

La dernière étape compte simplement combien de fois chaque mot a été utilisé en additionnant les nombres de toutes les paires pour le même mot.

Apache Spark semble être un outil formidable et polyvalent. Mais qu’apporte Apache Flink à la table ?

A première vue, il ne semble pas y avoir beaucoup de différences. Le diagramme d’architecture semble très similaire :

Si vous jetez un coup d’œil à l’exemple de code de l’application de comptage de mots pour Apache Flink, vous verrez qu’il n’y a presque aucune différence :

val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)

Peu de différences notables, c’est que dans ce cas, nous devons utiliser la méthode readTextFile au lieu de la méthode textFile et que nous devons utiliser une paire de méthodes : groupBy et sum au lieu de reduceByKey.

Alors, de quoi s’agit-il ? Apache Flink n’a peut-être pas de différences visibles à l’extérieur, mais il a certainement suffisamment d’innovations, pour devenir l’outil de traitement de données de nouvelle génération. En voici quelques-unes :

  • Implémente le traitement réel du streaming : Lorsque vous traitez un flux dans Apache Spark, il le traite comme de nombreux petits problèmes de lots, faisant ainsi du traitement en flux un cas particulier. Apache Flink, en revanche, traite le traitement par lots comme un cas particulier et n’utilise pas le micro-batching.
  • Meilleur support pour le traitement cyclique et itératif : Flink fournit quelques opérations supplémentaires qui permettent d’implémenter des cycles dans votre application de streaming et des algorithmes qui ont besoin d’effectuer plusieurs itérations sur des données en lot.
  • Gestion personnalisée de la mémoire : Apache Flink est une application Java, mais elle ne dépend pas entièrement du garbage collector de la JVM. Il implémente un gestionnaire de mémoire personnalisé qui stocke les données à traiter dans des tableaux d’octets. Cela permet de réduire la charge du ramasse-miettes et d’améliorer les performances. Vous pouvez lire à ce sujet dans cet article de blog.
  • Une latence plus faible et un débit plus élevé : De multiples tests effectués par des tiers suggèrent qu’Apache Flink a une latence plus faible et un débit plus élevé que ses concurrents.
  • Puissants opérateurs de fenêtres : Lorsque vous devez traiter un flux de données, dans la plupart des cas, vous devez appliquer une fonction à un groupe fini d’éléments dans un flux. Par exemple, vous pouvez avoir besoin de compter combien de clics votre application a reçu dans chaque intervalle de cinq minutes, ou vous pouvez vouloir savoir quel était le tweet le plus populaire sur Twitter dans chaque intervalle de dix minutes. Bien que Spark prenne en charge certains de ces cas d’utilisation, Apache Flink fournit un ensemble d’opérateurs beaucoup plus puissants pour le traitement des flux.
  • Implémente des instantanés distribués légers : Cela permet à Apache Flink de fournir une faible surcharge et des garanties de traitement en une seule fois dans le traitement de flux, sans utiliser le micro-batching comme le fait Spark.

Donc, vous travaillez sur un nouveau projet, et vous devez choisir un logiciel pour celui-ci. Qu’est-ce que vous devriez utiliser ? Spark ? Flink?

Bien sûr, il n’y a pas de bonne ou de mauvaise réponse ici. Si vous avez besoin de faire un traitement de flux complexe, alors je recommanderais d’utiliser Apache Flink. Il a un meilleur support pour le traitement de flux et quelques améliorations significatives.

Si vous n’avez pas besoin de fonctionnalités de traitement de flux de pointe et que vous voulez rester du côté sûr, il peut être préférable de rester avec Apache Spark. Il s’agit d’un projet plus mature qui dispose d’une plus grande base d’utilisateurs, de plus de matériel de formation et de plus de bibliothèques tierces. Mais gardez à l’esprit qu’Apache Flink réduit cet écart de minute en minute. De plus en plus de projets choisissent Apache Flink à mesure qu’il devient un projet plus mature.

Si, d’autre part, vous aimez expérimenter les dernières technologies, vous devez absolument donner une chance à Apache Flink.

Tout cela signifie-t-il qu’Apache Spark est obsolète et que, dans quelques années, nous allons tous utiliser Apache Flink ? La réponse peut vous surprendre. Alors que Flink a des fonctionnalités impressionnantes, Spark ne reste pas le même. Par exemple, Apache Spark a introduit la gestion personnalisée de la mémoire en 2015 avec la sortie du projet Tungsten, et depuis, il ajoute des fonctionnalités qui ont d’abord été introduites par Apache Flink. Le gagnant n’est pas encore décidé.

Dans les prochains articles de blog, j’écrirai davantage sur la façon dont vous pouvez utiliser Apache Flink pour le traitement par lots et en flux, alors restez à l’écoute!

Si vous voulez en savoir plus sur Apache Flink, vous pouvez jeter un coup d’œil à mon cours Pluralsight où je couvre Apache Flink plus en détail. Voici un bref aperçu de ce cours.

Laisser un commentaire