Apache flink 流中记录的排序

Apache flink 流中记录的排序,apache-flink,flink-streaming,Apache Flink,Flink Streaming,以下是我的一些疑问: 我有两个不同的流stream1和stream2,元素按顺序排列 1) 现在,当我对每个流执行keyBy操作时,是否会保持顺序?(因为这里的每个组将只发送给一个任务管理器) 我的理解是,记录将按顺序排列,请在此处更正 2) 在这两个流上执行keyBy之后,我正在进行联合分组,以获取匹配和非匹配记录。由于这也适用于KeyedStream,因此订单是否也会在此处保留。 我正在使用EventTime和AscendingTimestampExtractor生成时间戳和水印 3) 现在

以下是我的一些疑问:

我有两个不同的流
stream1
stream2
,元素按顺序排列

1) 现在,当我对每个流执行
keyBy
操作时,是否会保持顺序?(因为这里的每个组将只发送给一个任务管理器) 我的理解是,记录将按顺序排列,请在此处更正

2) 在这两个流上执行
keyBy
之后,我正在进行联合分组,以获取匹配和非匹配记录。由于这也适用于
KeyedStream
,因此订单是否也会在此处保留。 我正在使用
EventTime
AscendingTimestampExtractor
生成
时间戳
水印

3) 现在,我想使用map/flatmap对我从2)获得的
matching\u nonMatchingStream
执行序列检查。 我是否需要在此处再次执行
keyBy
,或者如果我保留链中的
matching\u nonMatchingStream
是否将在同一
TaskManager
中运行? 我在这里的理解是,链条将在这里工作,纠正我,变得混乱

4)
slotSharingGroup
-您能详细描述一下吗 根据单据:设置本次操作的槽位共享组。如果可能,同一插槽共享组中的并行操作实例将位于同一
TaskManager
插槽中

1)是和否。Flink使用所谓的跟踪订单。这样可以确保将记录分配到正确的窗口,并且在所有数据可用之前不会关闭窗口。但是,不保证每个组都有严格的顺序(因为)。在组之间,根本没有订购保证

2) 答案与(1)基本相同

3) 您无需再次使用
keyBy
。默认情况下,
map
/
flatMap
将链接

4) 有关订购保证,请参见

本页提供了良好的概述和解释,以及订购保证:

要点是:

顺序在每个并行流分区内保持。有关流分区的说明,请参见此处:

对于更改分区的“keyBy()”或“rebalance()”之类的操作,顺序是按每对源和目标流分区维护的,即按每对发送和接收运算符维护


正如Matthias提到的,如果一个组(由一个键定义,在一个接收目标操作符上运行)从多个发送方获取元素,则没有定义良好的元素严格排序。使用事件时间等概念,您可以基于数据(附加的时间戳)实施有意义的排序。

Flink不提供任何排序操作。您需要为此编写UDF代码。
@matthias-j-sax
:1)因此,如果我想保持每个组的严格顺序,我必须执行排序操作,对吗?2) 因此,如果不能保证顺序,那么现在使用AscendingTimestampExtractor是没有意义的3)当水印大于前一个时,就会发出水印,这是否意味着我必须保持当前和prevTimestamp,并在getCurrentWaterMark()方法
if(currentTimestamp>prevTimestamp)中进行检查
您仍然可以使用
AscendingTimestampExtractor
——您使用的提取器取决于您的用例语义,并且与排序保证无关。如果要进行排序,需要将所有元组缓冲到水印之间。当您收到第二个水印时,可以对所有缓冲元组进行排序,并按照正确的顺序发出。最后,清空缓冲区并从头开始下一个水印间隔。水印保证当前水印不再有延迟到达的数据。因此,对缓冲区进行排序将得到正确的结果。我不清楚我应该在哪里缓冲我的元素,您是否试图在收到第二个水印时说缓冲
getCurrentTimestamp()
中的元素,并对
getCurrentWatermark()
中的元素进行排序(我在这里感到困惑),您可以对所有缓冲元组进行排序,并以正确的顺序发出结果-我不知道这一点,我的理解是我们将在
getCurrentWatermark
中对元素进行排序,但我们将在哪里发出结果?我们可以通过电子邮件讨论这个问题吗?它变得越来越复杂。。。mjsax@apache.org(注释字段的大小受到限制)。这与您原来的问题不再相关。是的,我正在使用事件时间进行窗口设置,但无法理解我在哪里对元素进行排序(我们实际上在一个数据无序的用例中使用apply方法进行了排序),现在考虑到我能够对记录进行排序,因此根据文档,如果我只应用一个流,所有下游操作符将按顺序接收元素。只有当我使用keyBy或rebalance或其他操作符时,命令才会生效,对吗?