4

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

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

4

1 回答 1

4

是和不是。这取决于 ;)

这些框架不会强迫您提供确定性功能。

如果发生故障,您的输入数据的某些部分将被重新计算。中间结果将被丢弃。因此,如果您使用非确定性函数,新生成的中间结果可能与前一个(失败之前)不同。但是,如果您不关心这一点,则可以使用非确定性。

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

Flink/Storm(Trident)/Spark (exactly-once processing):

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

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

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