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

Flink已经与Spark进行了比较 ,正如我所看到的那样,它是错误的比较,因为它比较了窗口化的事件处理系统和微配量; 同样的,对我来说Flink和Samza的比较也没什么意义。 在这两种情况下,它都比较了实时与批量事件处理策略,即使Samza的规模较小。 但是我想知道Flink与Storm的比较,这在概念上似乎更接近于Storm。

我发现这个 (幻灯片#4)logging了Flink的主要区别是“可调整的等待时间”。 另外一个提示似乎是Slicon Angle的一篇文章,表明Flink更好地集成到Spark或HadoopMR世界中,但没有提及或引用实际的细节。 最后,Fabian Hueske自己在接受采访时指出:“与Apache Storm相比,Flink的stream分析function提供了高级API,并采用更轻量级的容错策略来提供一次处理保证。

这一切对我来说都有点稀疏,我不太明白这一点。 有人可以解释什么问题(s?)风暴stream处理是(是?)由Flink完全解决? 什么是Hueske提到的API问题和“更轻量级的容错策略”?

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

Apache Flink是统一stream和批处理的框架。 由于包括stream水线式混洗在内的并行任务之间的stream水线数据传输,Flink的运行时本地支持这两个域。 logging立即从生产任务发送到接收任务(在收集networking传输的缓冲区之后)。 可以使用阻塞数据传输select性地执行批量作业。

Apache Spark是一个支持批处理和stream处理的框架。 Flink的批处理API看起来非常相似,并且解决了与Spark相似的用例,但是在内部却有所不同。 对于stream式传输,两个系统都采用非常不同的方法(小批量与stream式传输),这使得它们适用于不同types的应用。 我会说比较Spark和Flink是有效和有用的,但是Spark并不是Flink最类似的stream处理引擎。

回到原来的问题,Apache Storm是一个没有批量function的数据stream处理器。 事实上,Flink的stream水线引擎在内部看起来有点类似于Storm,也就是说,Flink的并行任务的接口与Storm的螺栓相似。 Storm和Flink的共同之处在于它们旨在通过stream水线数据传输来实现低延迟stream处理。 但是,与Storm相比,Flink提供了更高级的API。 Flink的DataStream API提供了Map,GroupBy,Window和Join等function,而不是实现一个或多个阅读器和收集器的螺栓function。 使用Storm时,必须手动执行许多这些function。 另一个区别是处理语义。 风暴保证至less一次处理,而Flink只提供一次。 给予这些处理保证的实现差别很大。 当Storm使用logging级别的确认时,Flink使用Chandy-Lamportalgorithm的变体。 简而言之,数据源会周期性地将标记插入到数据stream中。 只要操作员接收到这样的标记,就检查其内部状态。 当所有数据接收器收到标记时,将提交标记(以及之前处理的所有logging)。 如果发生故障,所有来源操作员在看到上次提交的标记时将重置为其状态,并继续处理。 这种标记检查点方法比Storm的logging级别确认更轻量。 这个幻灯片集和相应的谈话讨论Flink的stream处理方法,包括容错,检查点和状态处理。

Storm还提供了一个名为Trident的完全一次的高级API。 但是,Trident基于小批量,因此与Flink相比更像Spark。

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

除了Fabian Hueske的回答:

Flink还在以下方面改进了Storm:

  • 背压:当不同的运营商以不同的速度运行时,Flink的stream媒体运行时间performance良好,因为尽pipenetworking层pipe理缓冲池,但是下游运营商很好地反压了上游运营商。

  • 用户定义的状态:Flink允许程序在操作员中维护自定义状态。 该状态实际上可以参与容错检查点的设置,为用户定义的自定义状态提供了一次性保证。 查看运算符中用户定义的状态机的示例 ,它与数据stream一起检查点一致。

  • stream式Windows:stream式窗口和窗口聚合是分析数据stream的重要组成部分。 Flink带有一个相当强大的窗口系统,支持多种types的窗口。