首页 文章

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

提问于
浏览
106

Flink已经compared to Spark,我认为这是错误的比较,因为它将窗口事件处理系统与微批处理进行比较;同样,将Flink与Samza进行比较对我来说没有多大意义 . 在这两种情况下,它都会比较实时与批量事件处理策略,即使是在Samza的情况下较小的"scale" . 但我想知道Flink与Storm的比较,它在概念上看起来与它更相似 .

我发现this(幻灯片#4)将主要区别记录为Flink的"adjustable latency" . 另一个提示似乎是Slicon Angle的一篇文章,表明Flink更好地集成到Spark或HadoopMR世界中,但没有提及或引用实际细节 . 最后,Fabian Hueske自己注意到in an interview "Compared to Apache Storm, the stream analysis functionality of Flink offers a high-level API and uses a more light-weight fault tolerance strategy to provide exactly-once processing guarantees."

这对我来说有点稀疏,我不太清楚 . 有人可以通过Flink解释Storm中的流处理是什么问题(??)?什么是Hueske所指的API问题及其“更轻量级的容错策略”?

2 回答

  • 38

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

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

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

    回到最初的问题,Apache Storm是一个没有批处理功能的数据流处理器 . 实际上,Flink 's pipelined engine internally looks a bit similar to Storm, i.e., the interfaces of Flink'的并行任务类似于Storm 's bolts. Storm and Flink have in common that they aim for low latency stream processing by pipelined data transfers. However, Flink offers a more high-level API compared to Storm. Instead of implementing the functionality of a bolts with one or more readers and collectors, Flink'的DataStream API提供了Map,GroupBy,Window和Join等功能 . 使用Storm时必须手动实现许多此功能 . 另一个区别是处理语义 . 风暴保证至少一次处理,而Flink只提供一次 . 给出这些处理保证的实现有很大不同 . 虽然Storm使用记录级别的确认,但Flink使用了Chandy-Lamport算法的变体 . 简而言之,数据源会定期将标记注入数据流 . 每当操作员收到这样的标记时,它就会检查其内部状态 . 当所有数据接收器都接收到标记时,将提交标记(以及之前已处理的所有记录) . 如果发生故障,所有源操作员在看到最后一个提交的标记并继续处理时将重置为其状态 . 这种标记检查点方法比Storm的记录级别确认更轻量级 . 这个slide set以及相应的talk讨论了Flink的流处理方法,包括容错,检查点和状态处理 .

    Storm还提供了一个名为Trident的一次性高级API . 然而,Trident基于迷你批次,因此更像Spark而不是Flink .

    Flink的可调延迟是指Flink将记录从一个任务发送到另一个任务的方式 . 我之前说过,Flink使用流水线数据传输并在生成后立即转发记录 . 为了提高效率,这些记录收集在缓冲区中,缓冲区一旦满,或满足特定时间阈值就通过网络发送 . 此阈值控制记录的延迟,因为它指定记录在未发送到下一个任务的情况下保留在缓冲区中的最长时间 . 但是,它不能用于确保记录从进入程序到离开程序所花费的时间,因为这还取决于任务内的处理时间和网络传输的数量等 .

  • 159

    添加到Fabian Hueske的答案:

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

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

    • 用户定义的状态:Flink允许程序在运算符中维护自定义状态 . 该状态实际上可以参与容错的检查点,为自定义用户定义的状态提供一次性保证 . 请参阅内部用户定义的状态机的this example运算符,与数据流一致地检查点 .

    • Streaming Windows:流窗口和窗口聚合是分析数据流的关键构建块 . Flink配备了一个非常强大的窗口系统,支持多种类型的窗口 .

相关问题