Java Spring Batch与Apache Spark的ETL基准测试比较

24

我已经使用Apache Spark + Scala工作了5年以上(学术和专业经验),我始终认为Spark / Scala是构建任何类型的批处理或流式ETL / ELT应用程序的强大组合。

但最近,我的客户决定在我们的两个主要管道中使用Java Spring Batch:

  1. 从MongoDB读取 -> 业务逻辑 -> 写入JSON文件(〜2GB | 600k行)
  2. 从Cassandra读取 -> 业务逻辑 -> 写JSON文件(〜4GB | 2M行)

这个企业级决策让我感到困惑。我同意,在行业中有比我更伟大的头脑,但我无法理解这种转变的必要性。

我的问题如下:

  1. 有人比较过Apache Spark和Java Spring Batch的性能吗?
  2. 与Spark相比,使用Spring Batch的优势是什么?
  3. 与Apache Spark相比,Spring Batch是否“真正分布式”?我在官方文档中看到了像chunk()和partition之类的方法,但我并不确定其真正的分布式性质。毕竟,Spring Batch在单个JVM实例上运行。是吗?

我无法理解这些问题。因此,我想利用这个平台就Spring Batch和Apache Spark进行公开讨论。


3
也许他们认为Spark的音量太低了。 - thebluephantom
@thebluephantom:音量是唯一的决定因素吗?从技术角度来看,还有哪些其他原因可能存在? - underwood
1
不太确定,也许有些聪明的人可以在这里解释一下。有不同的方法来实现相同的目标。刚刚阅读了相关资料,我认为与Spark相比没有真正的优势。 - thebluephantom
问题太过宽泛。 - thebluephantom
4
出于好奇,既然这是2018年的内容,我认为你们的流程现在已经投入生产了。你们的性能如何? - Philippe
1个回答

50
作为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支持两种主要的分布式模式:

  1. 远程分区 - 在这里,Spring Batch以主/工作器配置运行。主控节点根据协调机制(有很多选项)将工作委派给工作节点。此方法具有完全可重启性、错误处理等功能,并且对于远程JVM的元数据传输量最小,网络开销较小。Spring Cloud Task还提供了Spring Batch的扩展,允许使用云原生机制动态部署工作节点。
  2. 远程分块 - 远程分块只将步骤的处理和写入阶段委派给远程JVM。仍然使用主/工作者配置,主控节点负责向工作节点提供要处理和写入的数据。在此拓扑结构中,数据通过网络传输,导致网络负载加重。通常只在处理优势可以超越增加的网络流量开销时使用。

还有其他Stackoverflow答案进一步讨论了这些特性(文档也是如此):

Spring Batch的优点
Spring Batch远程分块和远程分区的区别
Spring Batch文档


1
这并不是一组答案,而是一组观点。很有趣,但就他/她的问题而言,我看不到任何真正切换的理由。 - thebluephantom
Apache Spark和Spring Batch不可比较,一些产品如Pivotal Gemfire与Spring Batch具有良好的连接性,但Apache Spark没有连接。我正在处理一些用例,也许会尝试比较性能。当连接到Hive以加载数据时,Spring Batch将会很痛苦,因为Hive MapReduce非常缓慢,所有性能都会受到影响,而在Spark中,您可以直接读取HDFS并且速度非常快。 - vaquar khan
1
作为答案中提到的主要原因之一,是为了找到那些能够快速掌握、使用或学习Spark的开发人员。在我看来,有很多情况下并不需要使用Spark,但人们仍然喜欢迁移,因为这听起来很酷。我使用传统的单服务器Java处理了超过8亿行数据,并进行了大量的转换。这种数据量并不是很常见的用例,我认为逻辑比框架更重要。 - JustTry
想知道Spring Batch是否考虑了Apache Beam并且使用Spark Runner?我已经使用过Apache Beam和Google Dataflow来进行批量处理,效果非常好。 - Tony Murphy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接