web-dev-qa-db-fra.com

ETL dans Java Spring Batch vs Apache Spark Benchmarking

Je travaille avec Apache Spark + Scala depuis plus de 5 ans maintenant (expériences académiques et professionnelles). J'ai toujours trouvé Spark/Scala comme l'un des des combos robustes pour créer tout type d'applications ETL/ELT en mode batch ou en streaming.

Mais récemment, mon client a décidé d'utiliser Java Spring Batch pour 2 de nos principaux pipelines:

  1. Lire depuis MongoDB -> Business Logic -> Écrire dans un fichier JSON (~ 2 Go | 600 000 lignes)
  2. Lire depuis Cassandra -> Business Logic -> Write JSON File (~ 4GB | 2M Rows)

J'étais assez déconcerté par cette décision au niveau de l'entreprise. Je suis d'accord qu'il y a des esprits plus grands que les miens dans l'industrie, mais je n'ai pas pu comprendre la nécessité de prendre cette décision.

Mes questions ici sont:

  1. Quelqu'un at-il comparé les performances entre Apache Spark et Java Spring Batch?)
  2. Quels pourraient être les avantages d'utiliser Spring Batch par rapport à Spark?
  3. Spring Batch est-il "vraiment distribué" par rapport à Apache Spark? Je suis tombé sur des méthodes comme chunk (), partition, etc. dans documents officiels mais je n'étais pas convaincu de sa véritable distribution. Après tout, Spring Batch s'exécute sur une seule instance JVM. N'est-ce pas ???

Je ne peux pas envelopper ma tête autour de ceux-ci. Donc, je veux utiliser cette plate-forme pour une discussion ouverte entre Spring Batch et Apache Spark.

8
underwood

En tant que responsable du projet Spring Batch, je suis sûr que vous comprendrez que j'ai une perspective spécifique. Cependant, avant de commencer, je dois souligner que les cadres dont nous parlons ont été conçus pour deux cas d'utilisation très différents. Spring Batch a été conçu pour gérer le traitement par lots d'entreprise traditionnel sur la machine virtuelle Java. Il a été conçu pour appliquer des modèles bien compris qui sont courants dans le traitement par lots d'entreprise et les rendre pratiques dans un cadre pour la JVM. Spark, d'autre part, a été conçu pour les cas d'utilisation du Big Data et de l'apprentissage automatique. Ces cas d'utilisation ont des modèles, des défis et des objectifs différents d'un système de traitement par lots d'entreprise traditionnel, et cela se reflète dans la conception du cadre. Cela étant dit, voici mes réponses à vos questions spécifiques.

Quelqu'un a-t-il comparé les performances entre Apache Spark et Java Spring Batch?

Personne ne peut vraiment répondre à cette question pour vous. Les repères de performance sont une chose très spécifique. Les cas d'utilisation comptent. Le matériel compte. Je vous encourage à faire vos propres tests de performances et profilage des performances pour déterminer ce qui fonctionne le mieux pour vos cas d'utilisation dans vos topologies de déploiement.

Quels pourraient être les avantages d'utiliser Spring Batch par rapport à Spark?

Modèle de programmation similaire à d'autres charges de travail d'entreprise
Les entreprises doivent être conscientes des ressources dont elles disposent pour prendre des décisions architecturales. L'utilisation de nouvelles technologies X vaut-elle le recyclage ou l'embauche de la technologie Y? Dans le cas de Spark vs Spring Batch, la montée en puissance d'un développeur Spring existant sur Spring Batch est très minime. Je peux prendre n'importe quel développeur qui est à l'aise avec Spring et les rendre pleinement productifs avec Spring Batch très rapidement. Spark a une courbe d'apprentissage plus abrupte pour le développeur d'entreprise moyen, non seulement en raison de la surcharge d'apprentissage du framework Spark mais de toutes les technologies associées) pour produire un Spark travail dans cet écosystème (HDFS, Oozie, etc.).

Aucune infrastructure dédiée requise
Lors de l'exécution dans un environnement distribué, vous devez configurer un cluster à l'aide de YARN, Mesos ou de la propre installation de cluster de Spark (il existe une option expérimentale Kubernetes disponible au moment de la rédaction de ce document, mais, comme indiqué, elle est étiqueté comme expérimental). Cela nécessite une infrastructure dédiée pour des cas d'utilisation spécifiques. Spring Batch peut être déployé sur n'importe quelle infrastructure. Vous pouvez l'exécuter via Spring Boot avec des fichiers JAR exécutables, vous pouvez le déployer dans des conteneurs de servlets ou des serveurs d'applications et vous pouvez exécuter des travaux Spring Batch via YARN ou tout autre fournisseur de cloud. De plus, si vous utilisez le concept JAR exécutable de Spring Boot, il n'y a rien à configurer à l'avance, même si vous exécutez une application distribuée sur la même infrastructure cloud que celle sur laquelle vous exécutez vos autres charges de travail.

Les lecteurs/rédacteurs prêts à l'emploi simplifient la création d'emplois
L'écosystème Spark est axé sur les cas d'utilisation du Big Data. Pour cette raison, les composants qu'il fournit prêts à l'emploi pour la lecture et l'écriture sont concentrés sur ces cas d'utilisation. Des choses comme Différentes options de sérialisation pour la lecture des fichiers couramment utilisés dans les cas d'utilisation du Big Data sont gérées de manière native, mais pas le traitement d'éléments tels que des morceaux d'enregistrements dans une transaction.

Spring Batch, quant à lui, fournit une suite complète de composants pour les entrées et sorties déclaratives. Lire et écrire des fichiers plats, des fichiers XML, des bases de données, des magasins NoSQL, des files d'attente de messagerie, écrire des e-mails ... la liste est longue. Spring Batch fournit tous ceux qui sont prêts à l'emploi.

Spark a été conçu pour le big data ... tous les cas d'utilisation ne sont pas des cas d'utilisation du big data
En bref, les fonctionnalités de Spark sont spécifiques au domaine pour lequel il a été conçu: Big Data et Machine Learning. Des choses comme la gestion des transactions (ou les transactions du tout) n'existent pas dans Spark. L'idée de revenir en arrière lorsqu'une erreur se produit n'existe pas (à ma connaissance) sans code personnalisé. Des cas d'utilisation de gestion d'erreurs plus robustes tels que sauter/réessayer ne sont pas fournis au niveau du framework. La gestion des états pour des choses comme le redémarrage est beaucoup plus lourde dans Spark que Spring Batch (persistance de la totalité du RDD vs stockage de l'état trivial pour des composants spécifiques). Toutes ces fonctionnalités sont des fonctionnalités natives de Spring Batch.

Spring Batch est-il "vraiment distribué"

L'un des avantages de Spring Batch est la possibilité de faire évoluer un processus par lots d'un simple processus JVM unique exécuté séquentiellement vers une solution en cluster entièrement distribuée avec un minimum de changements. Spring Batch prend en charge deux principaux modes distribués:

  1. Partitionnement à distance - Ici Spring Batch s'exécute dans une configuration maître/travailleur. Les maîtres délèguent le travail aux travailleurs en fonction du mécanisme d'orchestration (de nombreuses options ici). La possibilité de redémarrage complet, la gestion des erreurs, etc. sont toutes disponibles pour cette approche avec une surcharge réseau minimale (transmission de métadonnées décrivant chaque partition uniquement) aux JVM distantes. Spring Cloud Task fournit également des extensions à Spring Batch qui permettent aux mécanismes natifs du cloud de déployer dynamiquement les travailleurs.
  2. Chunking à distance - Le chunking à distance délègue uniquement les phases de traitement et d'écriture d'une étape à une JVM distante. Toujours en utilisant une configuration maître/travailleur, le maître est responsable de fournir les données aux travailleurs pour le traitement et l'écriture. Dans cette topologie, les données transitent sur le câble, provoquant une charge réseau plus lourde. Il n'est généralement utilisé que lorsque les avantages de traitement peuvent dépasser la surcharge du trafic réseau ajouté.

Il existe d'autres réponses Stackoverflow qui décrivent ces fonctionnalités plus en détail (tout comme la documentation):

Avantages du lot de printemps
Différence entre le découpage à distance par lots de printemps et le partitionnement à distance
Documentation Spring Batch

11
Michael Minella