与 Spark/Flink 相比,Apache Beam 在批处理方面有哪些优势?

What are the benefits of Apache Beam over Spark/Flink for batch processing?

Apache Beam 支持多个运行器后端,包括 Apache Spark 和 Flink。我熟悉 Spark/Flink,我正在尝试查看用于批处理的 Beam pros/cons。

查看 Beam word count example,感觉它与本地 Spark/Flink 等价物非常相似,可能语法稍微更冗长。

我目前没有看到选择 Beam 而不是 Spark/Flink 来完成这样的任务有什么大的好处。到目前为止我能做的唯一观察:

是否有更好的示例突出了 Beam 模型的其他 pros/cons?是否有任何关于失去控制如何影响性能的信息?

请注意,我并不是在寻求流媒体方面的差异,this question and summarized in this article 部分涵盖了这些内容(由于 Spark 1.X 而过时)。

Beam 在许多现有引擎上增加了一些东西。

  • 统一批处理和流处理。许多系统可以同时处理批处理和流处理,但它们通常通过单独的 API 来实现。但在 Beam 中,批处理和流式传输只是延迟、完整性和成本范围内的两个点。从批处理到流式处理没有 learning/rewriting 悬崖。因此,如果您今天编写了一个批处理管道,但明天您的延迟需要发生变化,那么调整起来非常容易。你可以在Mobile Gaming examples.

  • 看到这样的旅程
  • 提高抽象级别的 API:Beam 的 API 专注于捕获数据和逻辑的属性,而不是让底层的细节 运行时光倒流。这既是可移植性的关键(见下一段),也可以在执行方式上给予 运行 倍很大的灵活性。像 ParDo 融合(又名函数组合)这样的东西是绝大多数 运行ners 已经做过的非常基本的优化。一些 运行 用户仍在实施其他优化。例如,Beam 的 Source APIs 是专门为避免过度指定管道内的分片而构建的。相反,它们为 运行 人员提供了正确的挂钩,以动态地重新平衡可用机器之间的工作。通过从根本上消除散兵游勇的碎片,这可以在性能上产生巨大的差异。一般来说,我们可以为 运行 人培养的智慧越多,我们的生活就会越好。随着数据、代码和环境的变化,即使是最仔细的手动调整也会失败。

  • Portability across 运行times.:因为数据形状和运行时间要求被巧妙地分开,所以同一个管道可以运行 多种方式。这意味着当您必须从本地迁移到云端或从久经考验的系统迁移到最前沿的系统时,您最终不会重写代码。您可以非常轻松地比较选项以找到最适合您当前需求的环境和性能组合。这可能是多种因素的结合——使用开源 运行ner 在内部处理敏感数据,并在云中的托管服务上处理其他数据。

将 Beam 模型设计为对许多不同引擎的有用抽象是很棘手的。 Beam 既不是所有引擎功能的交集(太有限了!),也不是联合(太多厨房水槽了!)。相反,Beam 试图走在数据处理发展的最前沿,将功能推入 运行 时间引擎并从中拉出模式。

  • Keyed State is a great example of functionality that existed in various engines and enabled interesting and common use cases, but wasn't originally expressible in Beam. We recently expanded the Beam model to include a version of this functionality according to Beam's design principles.
  • 反之亦然,我们希望 Beam 也能影响各种引擎的路线图。例如,Flink 的 DataStreams 的语义是 influenced Beam(née Dataflow)模型。
  • 这也意味着在给定的时间点,不同的 Beam 运行ners 的能力并不总是完全相同。所以这就是为什么我们使用 capability matrix 来尝试清楚地传达事物的状态。