【问题标题】:Non-deterministic functions in stream processing流处理中的非确定性函数
【发布时间】:2016-11-23 14:23:11
【问题描述】:
像 StreamScope 这样的一些系统要求函数是确定性的(以及它们的处理顺序),这是因为每条消息在流中都有其序列号。在失败的情况下,此序列号用于确定是否应该重新计算事件(因为它是由流持续存在的),因此下游节点不会计算相同的事件两次。
Flink、Spark Streaming、Kafka-Streams 和 Storm 是否也要求函数具有确定性?
【问题讨论】:
标签:
apache-spark
apache-storm
apache-flink
apache-kafka-streams
【解决方案1】:
是和不是。这取决于;)
这些框架不会强迫您提供确定性函数。
如果出现故障,您输入数据的某些部分将被重新计算。中间结果将被丢弃。因此,如果您使用非确定性函数,新生成的中间结果可能与前一个(失败之前)不同。但是,如果您不关心这一点,则可以使用非确定性。
此外,这取决于您使用的语义。
Flink/Storm(Trident)/Spark(exactly-once processing):
- Flink 仅针对某些源和接收器提供 exaclty-once
- 为此,一些输出将被删除并在失败的情况下重新计算
- 例如 Flink 可以截断文件。因此,您可能希望确保不使用稍后可能会反转的消费者输出(或者您可能不在乎......)
- Spark/Storm 微批处理自动阻止下游消费者自动读取未提交的输出(我认为对于某些接收器,Flink 也是如此)
Flink/Storm/Kafka-Streams(至少一次处理):
- 如果在失败的情况下使用至少一次处理语义运行,您将在输出中得到一些重复。因此,如果您使用非确定性函数,这些“重复项”实际上可能具有不同的值(由于非确定性)