Fink 和 Storm 的主要区别是什么?

Flink 一直是 和斯巴克相比,在我看来,这是一个错误的比较,因为它将窗口事件处理系统与微批处理进行了比较; 同样,将 Flink 与 Samza 进行比较对我来说也没有多大意义。在这两种情况下,它都将实时事件处理策略与批处理策略进行了比较,即使 Samza 的“规模”较小。但是我想知道弗林克和斯托姆有什么不同,斯托姆在概念上似乎更相似。

我发现 这个(幻灯片 # 4)将主要区别记录为 Flink 的“可调延迟”。另一个提示似乎是 切片角度的一篇文章,其中建议 Flink 更好地集成到 Spark 或 HadoopMR 世界中,但没有提到或引用任何实际细节。最后,Fabian Hueske 自己指出 在一次采访中“与 Apache Storm 相比,Flink 的流分析功能提供了一个高级 API,并使用了一个更轻量级的容错策略来提供一次性处理保证。”

所有这些对我来说都有点稀疏,我不是很明白这一点。 有人能解释一下是什么问题吗与暴风雨中的流处理是(是?)被弗林克解决了吗?Hueske 所指的 API 问题及其“更轻量级的容错策略”是什么?

59736 次浏览

免责声明 : 我是 Apache Flink 提交者和 PMC 成员,只熟悉 Storm 的高级设计,不熟悉其内部结构。

ApacheFlink 是一个用于统一流和批处理的框架。Flink 的运行时本身支持这两个域,因为在并行任务之间流水线数据传输包括流水线洗牌。记录立即从生成任务发送到接收任务(在缓冲区中收集以进行网络传输之后)。可以使用阻塞数据传输选择性地执行批作业。

ApacheSpark 是一个支持批处理和流处理的框架。Flink 的批处理 API 看起来非常相似,并且处理类似于 Spark 的用例,但是在内部结构上有所不同。对于流,这两个系统遵循非常不同的方法(迷你批处理与流处理) ,这使得它们适合于不同类型的应用程序。我想说,比较 Spark 和 Flink 是有效和有用的,但是,Spark 并不是最类似于 Flink 的流处理引擎。

回到最初的问题,ApacheStorm 是一个没有批处理能力的数据流处理器。事实上,Flink 的流水线引擎在内部看起来有点像 Storm,也就是说,Flink 的并行任务的界面类似于 Storm 的螺栓。Storm 和 Flink 的共同目标是通过流水线数据传输实现低延迟流处理。然而,与 Storm 相比,Flink 提供了更高级的 API。Flink 的 DataStream API 没有使用一个或多个读取器和收集器来实现螺栓的功能,而是提供了诸如 Map、 GroupBy、 Window 和 Join 之类的函数。在使用 Storm 时,许多此功能必须手动实现。另一个区别是处理语义。Storm 保证至少一次处理,而 Flink 只提供一次处理。提供这些处理保证的实现有很大的不同。Storm 使用了创纪录的确认,而 Flink 使用了 Chandy-Lamport 算法的一个变体。简而言之,数据源周期性地将标记注入到数据流中。每当操作符接收到这样的标记时,它检查其内部状态。当所有数据接收器接收到标记时,将提交标记(以及以前处理过的所有记录)。在失败的情况下,所有源操作符在看到最后提交的标记时都会重置为其状态,并继续处理。这种标记检查点方法比 Storm 的记录级确认更轻量级。这个 幻灯片和相应的 谈谈讨论 Flink 的流处理方法,包括容错、检查点和状态处理。

Storm 还提供了一个名为 Trident 的一次性高级 API。然而,三叉戟是基于迷你批次,因此更类似于火花比弗林克。

Flink 的可调延迟指的是 Flink 将记录从一个任务发送到另一个任务的方式。我之前说过,Flink 使用流水线数据传输,并在记录生成后立即转发。为了提高效率,这些记录被收集在一个缓冲区中,一旦满了或者达到一定的时间阈值,缓冲区就会通过网络发送。此阈值控制记录的延迟,因为它指定记录在缓冲区中停留而不被发送到下一个任务的最长时间。然而,它不能用来硬性保证记录从进入程序到离开程序所需的时间,因为这也取决于任务内的处理时间和网络传输的数量等因素。

法比安•休斯克(Fabian Hueske)的回答又多了一个:

Flink 还可以通过以下方式对 Storm 进行改进:

  • 反向压力: 当不同的运营商以不同的速度运行时,Flink 的流式运行时表现良好,因为下游运营商反向压力上游运营商非常好,尽管网络层的管理缓冲池。

  • 用户定义状态: Flink 允许程序在操作符中维护自定义状态。该状态实际上可以参与容错检查点,为自定义用户定义的状态提供一次性保证。请参见操作符内部的用户定义状态机的 这个例子,它与数据流一起始终处于检查点状态。

  • 流窗口: 流窗口和窗口聚合是分析数据流的关键构件。Flink 提供了一个非常强大的视窗系统,支持多种类型的窗口。

根据我对风暴和闪灵的经验。我觉得这些工具可以用不同的方法解决同样的问题。@ Stephan Ewen 提到的 Flink 的所有特性现在都可以和 Storm 的内部 API (即 斑点螺栓)和 三叉戟 API 相匹配。有人声称 三叉戟是迷你批处理风格,而我认为大多数与状态相关或聚合的复杂应用程序只能依赖于窗口风格的批处理。所以我只是列出了一些主要的不同之处,没有说哪个更好。

  • 开发风格 . Flink 中的面向计算(例如,可链接操作符)与 Storm 中的面向数据流(例如,addSpolt()/addBolt())。
  • 高级 API . Flink 对本地窗口和风暴中的三叉戟中的函数(例如,地图、窗口、加入流级别)。
  • 保证消息处理(GMP。即 马上) 。检查点与两阶段提交连接器(例如,卡夫卡消费者)在 Flink 与元组树与外部状态机或三叉戟在风暴。
  • Flink 中的标记检查点与 Storm 中的记录级 ACK 相比,具有更强的容错性。
  • 内部架构 。简单的抽象和相对的并行性(例如,每个线程的插槽考虑与 CPU 核心)在 Flink 与多层抽象(例如,插槽为每个 JVM 作为工作者在主管和每个主管可以有许多工作者)在 Storm。

免责声明: 我是 Cloudera 的雇员,是 Storm 和(很快) Fink 的主要支持者。

功能性的

已经介绍了很多好的技术要点,以下是一个非常简短的摘要:

  • Flink 和 Storm 都可以进行事件处理
  • 风暴似乎不支持事件时间的盒子
  • Storm 还没有将 SQL 支持提升到实验阶段以外

非功能性

  • 许多顾客发现 Storm 太难使用了
  • 风暴的使用速度减慢了,而且 Fink 的社区现在似乎比风暴更加活跃
  • Flink 还有一些工作要做(例如文档化的例子) ,但总的来说,它已经在你可能想到的几乎每一个领域都做到了

结论

Cloudera 最近宣布了对 Storm (HDP)的反对,同时宣布 Flink 为其继任者。

所以,如果你有风暴的用例,他们当然会继续工作。但对于新的用例,我会研究 Fink 或其他流媒体引擎。