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或其他操作符时,命令才会生效,对吗?