流处理中的非确定性函数

时间:2016-11-23 14:23:11

标签: apache-spark apache-storm apache-flink apache-kafka-streams

某些系统(如StreamScope)要求函数具有确定性(以及它们的处理顺序),这是因为每条消息在流中都有其序列号。如果出现故障,此序列号用于确定是否应重新计算事件(因为它是由流持续存在的),因此下游节点不会计算两次相同的事件。

Flink,Spark Streaming,Kafka-Streams和Storm是否也要求功能具有确定性?

1 个答案:

答案 0 :(得分:3)

是和否。这取决于;)

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

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

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

Flink / Storm(Trident)/ Spark(完全一次处理):

  • Flink offeres exaclty-once only for some sources and sinks
  • 为此,一些输出将被删除并在发生故障时重新计算
    • Flink例如可以截断文件。因此,您可能希望确保不会在以后可能会被撤消的消费者输出(或者您可能不关心......)
  • Spark / Storm微批处理自动阻止下游消费者自动读取未提交的输出(我认为对于某些接收器,Flink也会这样做)

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

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