Apache Flink 中的 DataStream 和 KeyedStream 有什么区别?

What is the difference between DataStream and KeyedStream in Apache Flink?

我正在研究使用 Flink 连接两个流的上下文,想了解这两个流有何不同以及如何影响 Flink 处理它们的方式。

作为一个相关问题,我还想了解 CoProcessFunction 与 KeyedCoProcessFunction 有何不同。

A KeyedStream 是一个经过散列分区的 DataStream,其效果是对于任何给定的键,该键的每个流元素都在同一分区中。这保证了一个键的所有消息都由同一个工作实例处理。只有键控流可以使用键分区状态和计时器。

A KeyedCoProcessFunction 连接两个以兼容方式键入的流——这两个流映射到相同的键空间——使得 KeyedCoProcessFunction 具有相关的键控状态成为可能到两个流。例如,您可能希望将客户交易流与客户更新流结合起来——在 customer_id 上加入他们。您可以通过 customer_id 键控两个流并使用 KeyedCoProcessFunction.

连接这些键控流,在 Flink 中实现这一点(如果在低级别这样做)

另一方面,CoProcessFunction 有两个输入,但这些输入之间没有特定关系。

Flink 培训的教程涵盖 keyed streams and connected streams, and a related exercise/example