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