以下是我的一些查询:
我有两个不同的流stream1
和stream2
,其中元素按顺序排列。
1)现在,当我对这些流中的每一个进行keyBy
时,是否会保留订单? (因为这里的每个组都只会被发送给一个任务管理器)
我的理解是,记录将是为了一个团体,在这里纠正我。
2)在两个流上的keyBy
之后,我正在进行共同组以获取匹配和不匹配的记录。订单是否也会在这里维护?,因为这也适用于KeyedStream
。
我使用EventTime
和AscendingTimestampExtractor
来生成timestamp
和watermark
。
3)现在我想使用map / flatmap对我从2获得的matching_nonMatchingStream
执行序列检查。
我是否需要在此处再次执行keyBy
,或者如果我保持链接,matching_nonMatchingStream
将在同一TaskManager
中运行?
我的理解是,链条将在这里工作,纠正我,变得困惑。
4)slotSharingGroup
- 请您详细说明一下这个问题
根据文档:设置此操作的插槽共享组。如果可能,位于同一插槽共享组中的并行操作实例将位于同一TaskManager
插槽中。
答案 0 :(得分:4)
此页面提供了良好的概述和解释,以及订购保证:https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/concepts.html#parallel-dataflows
要点是:
在每个并行流分区中维护订单。有关流分区的说明,请参阅此处:https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/concepts.html#parallel-dataflows
对于" keyBy()"等操作或"重新平衡()"更改分区,每对源和目标流分区维护顺序,这意味着每对发送和接收运营商。
正如马蒂亚斯所提到的,如果一个组(由一个密钥定义,在一个接收目标运算符上运行)从多个发送者获取元素,则没有明确定义的元素严格排序。使用事件时间等概念,您可以根据数据(附加的时间戳)强制执行有意义的排序。
答案 1 :(得分:3)
1)是和否。 Flink使用所谓的Watermarks来跟踪排序。这可以确保可以将记录分配给正确的窗口,并且在所有数据都可用之前窗口不会关闭。但是,每个组都不能保证严格的顺序(因为parallel incoming data)。在群组之间,根本没有订购保证。
2)与(1)基本相同的答案。
3)您无需再次使用keyBy
。 <{1}} / map
默认会被链接。