一些像streamscope这样的系统要求函数具有确定性(以及处理它们的顺序),这是因为在流中每个消息都有其序列号。在失败的情况下,此序列号用于确定是否应重新计算事件(因为流持久化了该事件),这样下游节点就不会两次计算相同的事件。flink、spark streaming、kafka streams和storm是否也要求函数具有确定性?
laawzig21#
是和否,视情况而定;)这些框架并不强迫您提供确定性函数。如果出现故障,将重新计算输入数据的某些部分。中间结果将被丢弃。因此,如果使用非确定性函数,则新生成的中间结果可能与前一个结果(失败前)不同。然而,如果你不关心这个,使用非决定论是可以的。此外,它取决于您使用的语义。flink/storm(三叉戟)/spark(仅处理一次):Flink只为某些源和汇提供一次Exacty为此,一些输出将被删除,并在失败时重新计算例如,flink可以截断一个文件。因此,您可能希望确保不要使用稍后可能会反转的消费输出(或者您可能不在乎…)spark/storm微批处理自动防止下游消费者自动读取未提交的输出(我认为对于某些接收器,flink也是这样做的)flink/storm/kafka流(至少处理一次):如果在失败的情况下使用至少一次处理语义运行,那么在输出中会得到一些重复的结果。因此,如果您使用非确定性函数,那些“副本”实际上可能有不同的值(由于非确定性)
1条答案
按热度按时间laawzig21#
是和否,视情况而定;)
这些框架并不强迫您提供确定性函数。
如果出现故障,将重新计算输入数据的某些部分。中间结果将被丢弃。因此,如果使用非确定性函数,则新生成的中间结果可能与前一个结果(失败前)不同。然而,如果你不关心这个,使用非决定论是可以的。
此外,它取决于您使用的语义。
flink/storm(三叉戟)/spark(仅处理一次):
Flink只为某些源和汇提供一次Exacty
为此,一些输出将被删除,并在失败时重新计算
例如,flink可以截断一个文件。因此,您可能希望确保不要使用稍后可能会反转的消费输出(或者您可能不在乎…)
spark/storm微批处理自动防止下游消费者自动读取未提交的输出(我认为对于某些接收器,flink也是这样做的)
flink/storm/kafka流(至少处理一次):
如果在失败的情况下使用至少一次处理语义运行,那么在输出中会得到一些重复的结果。因此,如果您使用非确定性函数,那些“副本”实际上可能有不同的值(由于非确定性)