【问题标题】:ETL in Java Spring Batch vs Apache Spark BenchmarkingJava Spring Batch 中的 ETL 与 Apache Spark 基准测试
【发布时间】:2019-05-10 09:36:56
【问题描述】:

我已经使用 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 之间进行公开讨论。

【问题讨论】:

  • 可能他们认为 Spark 的数量太少。
  • @thebluephantom:音量是唯一的决定因素吗?从技术角度看,还有哪些其他原因?
  • 不确定,也许一些明亮的火花可以在这里照亮。有不同的方法可以实现相同的目标。刚读完这篇文章,我认为 Spark 没有真正的优势。
  • 问题实在是太宽泛了。
  • 尝试使用 jsoniter-scala 来编写 JSON 文件。如果没有很多浮点数要序列化,那么您可以在一个线程中获得每秒约 1-2GB 的速度。只需在此处查看不同数据类型和消息样本的基准测试结果:plokhotnyuk.github.io/jsoniter-scala

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


【解决方案1】:

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

有人比较过 Apache Spark 和 Java Spring Batch 的性能吗?

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

与 Spark 相比,使用 Spring Batch 有哪些优势?

类似于其他企业工作负载的编程模型
企业在做出架构决策时需要了解他们手头的资源。使用新技术 X 是否值得对技术 Y 进行再培训或雇用开销?在 Spark 与 Spring Batch 的情况下,现有 Spring 开发人员在 Spring Batch 上的提升非常小。我可以让任何熟悉 Spring 的开发人员快速使用 Spring Batch 让他们充分发挥生产力。对于普通企业开发人员而言,Spark 的学习曲线更为陡峭,这不仅是因为学习 Spark 框架的开销,而且是因为在该生态系统(HDFS、Oozie 等)中用于将 Spark 作业临时化的所有相关技术。

不需要专门的基础设施
在分布式环境中运行时,您需要使用 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。仍然使用 master/worker 配置,master 负责将数据提供给 worker 进行处理和写入。在这种拓扑结构中,数据通过线路传输,从而导致更重的网络负载。它通常仅在处理优势可以超过增加的网络流量的开销时使用。

还有其他 Stackoverflow 答案更详细地讨论了这些功能(与文档一样):

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

【讨论】:

  • 它并没有真正打动我作为一组答案,而是一组观点。有趣,但就他/她的问题而言,我认为没有真正的理由改变。
  • Apache Spark 和 Spring 批处理不可比 少数产品 spl 关键 gemfire 与 spring 批处理具有良好的连接性,但 apache spark 没有连接,我正在处理一些用例可能会尝试比较性能,备用批处理将是连接到 hive 以加载数据时很痛苦,因为 hive map reduce 非常慢,所有性能都会被杀死,而在 spark 中,您可以直接读取 HDFS,并且速度会非常快。
猜你喜欢
  • 1970-01-01
  • 2018-06-08
  • 2014-09-16
  • 2012-05-14
  • 2018-01-19
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多