Flink和Storm之间的主要区别是什么?


137

Flink已与Spark进行了比较,在我看来,Spark是错误的比较,因为它将窗口事件处理系统与微批处理进行了比较。同样,将Flink与Samza进行比较对我来说也没有太大意义。在这两种情况下,它都会比较实时事件处理策略和批处理事件处理策略,即使对于Samza而言,其规模较小。但是我想知道Flink与Storm的比较,Storm在概念上看起来与它更相似。

我发现幻灯片(第4张)将主要区别记录为Flink的“可调延迟”。另一个提示似乎是Slicon Angle的文章,它暗示Flink可以更好地集成到Spark或HadoopMR世界中,但是没有提及或引用任何实际细节。最后,Fabian Hueske本人在一次采访中指出:“与Apache Storm相比,Flink的流分析功能提供了高级API,并使用了更轻量级的容错策略来提供一次精确的处理保证。”

这对我来说有点稀疏,我不太明白这一点。有人可以解释一下Flink完全解决了Storm中流处理的哪些问题吗?API问题及其“更轻量级的容错策略”指的是Hueske指的是什么?


2
请注意,Apache Spark(链接的问题的焦点)与Apache Storm(此处的问题)不同-因此,不,这绝不是重复的。
fnl

Answers:


212

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

Apache Flink是用于统一流和批处理的框架。由于并行任务之间的管道数据传输(包括管道随机播放),Flink的运行时本机支持这两个域。记录从生产任务立即传送到接收任务(在收集到网络传输的缓冲区中之后)。批处理作业可以选择使用阻止数据传输来执行。

Apache Spark是一个还支持批处理和流处理的框架。Flink的批处理API看起来非常相似,并且解决了与Spark类似的用例,但是内部结构有所不同。对于流传输,两个系统都采用截然不同的方法(迷你批处理与流传输),这使它们适用于不同类型的应用程序。我会说比较Spark和Flink是有效和有用的,但是,Spark不是与Flink最相似的流处理引擎。

谈到最初的问题,Apache Storm是一个没有批处理功能的数据流处理器。实际上,Flink的流水线引擎在内部看起来与Storm类似,即Flink并行任务的界面类似于Storm的螺栓。Storm和Flink的共同点在于,它们旨在通过流水线式数据传输来实现低延迟流处理。但是,与Storm相比,Flink提供了更高级的API。Flink的DataStream API并未提供具有一个或多个阅读器和收集器的螺栓功能,而是提供了诸如Map,GroupBy,Window和Join之类的功能。使用Storm时,必须手动实现许多此功能。另一个区别是处理语义。Storm保证至少执行一次,而Flink提供一次。提供这些处理保证的实现方式相差很多。尽管Storm使用记录级别的确认,但Flink使用Chandy-Lamport算法的变体。简而言之,数据源会定期将标记插入数据流中。每当操作员收到此类标记时,它都会检查其内部状态。当所有数据接收器都接收到标记时,将提交标记(以及之前已处理的所有记录)。如果发生故障,当所有源操作员看到最后提交的标记时,它们将重置为其状态,并继续进行处理。这种标记检查点方法比Storm的记录级确认更轻便。这个 数据源定期将标记插入数据流中。每当操作员收到此类标记时,它都会检查其内部状态。当所有数据接收器都接收到标记时,将提交标记(以及之前已处理的所有记录)。如果发生故障,当所有源操作员看到最后提交的标记时,它们将重置为其状态,并继续进行处理。这种标记检查点方法比Storm的记录级确认更轻便。这个 数据源定期将标记插入数据流中。每当操作员收到此类标记时,它都会检查其内部状态。当所有数据接收器都接收到标记时,将提交标记(以及之前已处理的所有记录)。如果发生故障,当所有源操作员看到最后提交的标记时,它们将重置为其状态,并继续进行处理。这种标记检查点方法比Storm的记录级确认更轻便。这个 当他们看到最后提交的标记并继续处理时,所有源操作员将重置为其状态。这种标记检查点方法比Storm的记录级确认更轻便。这个 当他们看到最后提交的标记并继续处理时,所有源操作员将重置为其状态。这种标记检查点方法比Storm的记录级确认更轻便。这个幻灯片集和相应的讨论讨论了Flink的流处理方法,包括容错,检查点和状态处理。

Storm还提供了一次仅称为Trident的高级API。但是,Trident基于迷你批处理,因此与Flink相比更类似于Spark。

Flink的可调延迟是指Flink将记录从一个任务发送到另一个任务的方式。我之前说过,Flink使用流水线数据传输并在产生记录后立即转发记录。为了提高效率,这些记录收集在一个缓冲区中,一旦缓冲区已满或达到某个时间阈值,该缓冲区就会通过网络发送。此阈值控制记录的延迟,因为它指定了记录将保留在缓冲区中而不发送到下一个任务的最长时间。但是,它不能用于为记录从进入到离开程序所花费的时间提供严格的保证,因为这还取决于任务中的处理时间以及网络传输的数量。


2
确实非常感谢您!如果我可以再次打扰您,也许有一个开放点:这个“可调延迟”问题是什么?鉴于不同的应用程序领域在这方面有不同的要求,这似乎很相关。您至少可以从Flink上解释一下这意味着什么吗?
fnl 2015年

6
当然,我扩展了答案并讨论了可调整的延迟。如果您还有其他问题,请告诉我。
Fabian Hueske 2015年

Flink是否可以像使用Erlang那样实现DAG工作流程的“热”更改?IE浏览器 可以在运行时更改DAG吗?
托马斯·布朗

1
无法进行热代码交换。但是,您可以将应用程序的状态保留为保存点。该保存点可用于启动修改后的应用程序。可以在原始应用程序仍在运行的情况下执行此操作,以便可以在某个时候翻转输出。请注意,从现有保存点恢复时,无法随意修改应用程序。
Fabian Hueske '18年

1
Flink有趣且巨大的优势是能够使用更高级别的API运行Apache Beam。它是Beam最丰富,最完整的跑步者之一。
Piotr Gwiazda

47

添加到Fabian Hueske的答案中:

Flink还通过以下方式在Storm上进行了改进:

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

  • 用户定义的状态:Flink允许程序在您的操作员中维护自定义状态。该状态实际上可以参与容错性的检查点,从而为自定义用户定义状态提供一次精确的保证。请参见操作员内部用户定义状态机的此示例该示例与数据流一起被一致检查点。

  • 流窗口:流窗口和窗口聚合是分析数据流的关键构建块。Flink带有功能强大的窗口系统,该系统支持多种类型的窗口。


2
关于您的第一点,Storm在1.0的背压下表现良好(2016年4月发布)
Colin Nichols

可以使用“ spout_max_pending”属性缓解风暴背压。它为等待确认的喷嘴中可能存在的最大元组设置阈值。在确认发生之前,Spout不会继续消耗任何元组。
阿曼·加尔格

3

根据我对Storm和Flink的经验。我觉得这些工具可以用不同的方法解决相同的问题。@Stephan Ewen提到的Flink的每个功能现在都可以由Storm与内部API(即spoltsbolts)和Trident API 相匹配。有人声称Trident是迷你批处理样式,而我认为大多数与状态相关或聚合的复杂应用程序只能依赖于具有窗口样式的批处理。因此,我只是在这里列出一些主要区别,而没有说哪个更好。

  • 发展风格。Flink中面向计算的(例如可链接的运算符)与addSpolt()/addBolt()Storm中面向数据流的(例如)相对。
  • 高级API。Flink vs. Native Window和Storm中的Trident中的功能(例如,Map,Window,Join in Streaming级)。
  • 保证的消息处理(GMP,即一次。Flink中带有两阶段提交连接器(例如,KafkaConsumer)的检查点与带有外部状态机的Triple树或Storm中的Trident。
  • 容错能力。Flink中的标记检查点与Storm中的记录级别ACK。
  • 内部结构。Flink中的简单抽象和相对并行度(例如,与CPU内核一起考虑的每个线程的插槽)与Storm中的多层抽象(例如,作为主管的每个JVM的插槽,每个主管可以有多个工作器)。

3

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

功能性

已经提出了很多好的技术要点。重点摘要非常简短:

  • Flink和Storm都可以执行每个事件的处理
  • Storm似乎不支持事件时间
  • Storm并未将SQL支持从试验阶段中取消

无功能

  • 许多客户发现Storm(太)难以使用
  • Storm的采用速度放慢了,Flink社区现在似乎比Storm更活跃
  • Flink仍有一些工作要做(例如,记录的示例),但总的来说,它已经涉及到您可能想到的几乎每个领域

结论

Cloudera最近宣布淘汰Storm(在HDP中)。同时,Flink被宣布为其继任者。

因此,如果您遇到了很多用例,它们当然会继续起作用。但是对于新的用例,我将研究Flink或其他流引擎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.