流处理中的非确定性函数

Non-deterministic functions in stream processing

StreamScope 等一些系统要求函数是确定性的(以及它们的处理顺序),这是因为每条消息在流中时都有其序列号。在失败的情况下,此序列号用于确定是否应重新计算事件(因为它被流保留),以便下游节点不会计算相同的事件两次。

Flink、Spark Streaming、Kafka-Streams 和 Storm 是否也要求函数具有确定性?

是也不是。这取决于 ;)

框架不会强制您提供确定性函数。

如果出现故障,将重新计算输入数据的某些部分。中间结果将被丢弃。因此,如果您使用非确定性函数,新生成的中间结果可能与前一个(失败前)不同。不过,如果你不在乎这个,用non-determinism就好了。

此外,这取决于您使用的语义。

Flink/Storm(三叉戟)/Spark(恰好一次处理):

  • Flink 仅针对某些源和接收器提供 exaclty-once
  • 为此,一些输出将被删除并在失败的情况下重新计算
    • 例如 Flink 可以 运行cata 文件。因此,您可能希望确保不要使用稍后可能会逆转的输出(或者您可能不在乎...)
  • Spark/Storm 微批处理自动阻止下游消费者自动读取未提交的输出(我认为对于某些接收器,Flink 也是如此)

Flink/Storm/Kafka-Streams(至少处理一次):

  • 如果您 运行 在失败的情况下使用至少一次处理语义,您将在输出中得到一些重复项。因此,如果您使用非确定性函数,那些 "duplicates" 实际上可能具有不同的值(由于非确定性)