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

时间:2018-12-09 04:59:13

标签: spring spring-boot apache-spark spring-batch etl

我已经与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是否“真正分布”?我在offcial docs中遇到了诸如chunk(),partition等方法,但我不相信其真正的分布式性。在所有Spring Batch在单个JVM实例上运行之后。是不是???

我无法绕过这些。因此,我想使用该平台在Spring Batch和Apache Spark之间进行公开讨论。

1 个答案:

答案 0 :(得分:6)

作为Spring Batch项目的负责人,我相信您会理解我有特定的见解。但是,在开始之前,我应该指出,我们所讨论的框架是为两个非常不同的用例设计的。 Spring Batch设计为在JVM上处理传统的企业批处理。它被设计为应用在企业批处理中很常见的易于理解的模式,并使其在JVM框架中方便使用。另一方面,Spark专为大数据和机器学习用例而设计。与传统的企业批处理系统相比,这些用例具有不同的模式,挑战和目标,这反映在框架的设计中。话虽如此,这是我对您的特定问题的回答。

有人可以比较Apache Spark和Java Spring Batch之间的性能吗?

没有人能真正为您回答这个问题。性能基准是非常具体的事情。用例很重要。硬件很重要。我鼓励您进行自己的基准测试和性能分析,以确定哪种最适合您的部署拓扑中的用例。

相比于Spark,使用Spring Batch有什么优势?

与其他企业工作负载类似的编程模型
企业在制定体系结构决策时需要意识到他们拥有的资源。使用新技术X是否值得对技术Y进行再培训或雇用开销?对于Spark vs Spring Batch,在Spring Batch上现有Spring开发人员的提升非常小。我可以聘请任何对Spring满意的开发人员,并迅速使他们在Spring Batch中变得完全有生产力。对于普通的企业开发人员来说,Spark的学习曲线更为陡峭,这不仅是因为学习Spark框架的开销很大,而且还因为所有相关技术都可以使该生态系统中的Spark作业(HDFS,Oozie等)成为标准。

不需要专用的基础架构
在分布式环境中运行时,您需要使用YARN,Mesos或Spark自己的集群安装来配置集群(在撰写本文时,有一个实验性的Kubernetes选项可用,但如前所述,它被标记为实验性)。这需要用于特定用例的专用基础结构。 Spring Batch可以部署在任何基础架构上。您可以使用可执行的JAR文件通过Spring Boot执行它,可以将其部署到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答案可以更详细地讨论这些功能(与文档一样):

Advantages of spring batch
Difference between spring batch remote chunking and remote partitioning
Spring Batch Documentation