作为Spring Batch项目的负责人,我相信你会有一个特定的视角。但是,在开始之前,我应该指出,我们正在讨论的框架是为两种非常不同的用例设计的。Spring Batch旨在处理JVM上的传统企业批处理。它被设计为应用通常在企业批处理中使用的经过充分理解的模式,并将它们方便地应用于JVM框架中。另一方面,Spark是为大数据和机器学习用例而设计的。这些用例具有不同的模式、挑战和目标,与传统的企业批处理系统不同,这反映在框架的设计中。话虽如此,以下是我对您特定问题的回答。
是否有人比较过Apache Spark和Java Spring Batch的性能?
没有人真正可以回答这个问题。性能基准测试是一个非常具体的事情。用例很重要。硬件也很重要。我鼓励您进行自己的基准测试和性能分析,以确定在您的部署拓扑中,什么最适合您的用例。
使用Spring Batch相比Spark可能有什么优势?
与其他企业工作负载类似的编程模型
在做架构决策时,企业需要注意手头拥有的资源。使用新技术X是否值得重新培训或雇佣技术Y?在Spark与Spring Batch之间,对于已有Spring开发人员使用Spring Batch所需的上手时间非常短。我可以将任何熟悉Spring的开发人员迅速转化为完全熟练的Spring Batch开发人员。对于普通企业开发人员而言,Spark的学习曲线更陡峭,不仅因为需要学习Spark框架的开销,还要学习生态系统中所有相关技术(如HDFS、Oozie等)以实现Spark作业的生产化。
无需专用基础设施
在分布式环境中运行时,需要使用YARN、Mesos或Spark自己的集群安装进行集群配置(目前正在编写本文时,有一个实验性的Kubernetes选项可用,但标注为实验性)。这需要针对特定用例的专用基础设施。Spring Batch可以部署在任何基础设施上。您可以通过Spring Boot使用可执行JAR文件来执行它,也可以将其部署到Servlet容器或应用程序服务器中,并且可以通过YARN或任何云提供商运行Spring Batch作业。此外,如果使用Spring Boot的可执行JAR概念,则无需提前设置任何内容,即使在同一基于云的基础设施上运行分布式应用程序也是如此。
更多直接可用的读写器简化作业创建
Spark生态系统关注大数据应用案例。因此,它提供的用于读取和写入的组件专注于这些用例。用于读取在大数据应用案例中常用文件的不同序列化选项等内容可以进行本地处理。但是,在事务内处理记录块等内容则不能。
另一方面,Spring Batch提供了完整的组件套件,用于申明式输入和输出。可以从数据库、NoSQL存储、消息队列、电子邮件等读取和编写平面文件、XML文件等等。Spring Batch提供了所有这些功能。
Spark是为大数据构建的...并非所有用例都是大数据用例
简而言之,Spark的功能针对其构建领域:大数据和机器学习。像事务管理(或根本没有事务)这样的内容在Spark中不存在。当发生错误时回滚的想法不存在(据我所知)没有自定义代码。更强大的错误处理用例,如跳过/重试,没有在框架级别提供。对于重新启动等状态管理,Spark比Spring Batch更加繁重(持久化整个RDD与为特定组件存储微不足道的状态)。所有这些功能都是Spring Batch的本生功能。
Spring Batch是否“真正分布式”
Spring Batch的一个优点是能够将批处理过程从简单的顺序执行、单JVM进程演变为全分布式、集群解决方案,而只需进行最少量的更改。Spring Batch支持两种主要的分布式模式:
- 远程分区 - 在这里,Spring Batch以主/工作器配置运行。主控节点根据协调机制(有很多选项)将工作委派给工作节点。此方法具有完全可重启性、错误处理等功能,并且对于远程JVM的元数据传输量最小,网络开销较小。Spring Cloud Task还提供了Spring Batch的扩展,允许使用云原生机制动态部署工作节点。
- 远程分块 - 远程分块只将步骤的处理和写入阶段委派给远程JVM。仍然使用主/工作者配置,主控节点负责向工作节点提供要处理和写入的数据。在此拓扑结构中,数据通过网络传输,导致网络负载加重。通常只在处理优势可以超越增加的网络流量开销时使用。
还有其他Stackoverflow答案进一步讨论了这些特性(文档也是如此):
Spring Batch的优点
Spring Batch远程分块和远程分区的区别
Spring Batch文档