流中记录的排序

时间:2016-07-13 14:36:24

标签: apache-flink flink-streaming

以下是我的一些查询:

我有两个不同的流stream1stream2,其中元素按顺序排列。

1)现在,当我对这些流中的每一个进行keyBy时,是否会保留订单? (因为这里的每个组都只会被发送给一个任务管理器) 我的理解是,记录将是为了一个团体,在这里纠正我。

2)在两个流上的keyBy之后,我正在进行共同组以获取匹配和不匹配的记录。订单是否也会在这里维护?,因为这也适用于KeyedStream。 我使用EventTimeAscendingTimestampExtractor来生成timestampwatermark

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

4)slotSharingGroup - 请您详细说明一下这个问题 根据文档:设置此操作的插槽共享组。如果可能,位于同一插槽共享组中的并行操作实例将位于同一TaskManager插槽中。

2 个答案:

答案 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默认会被链接。

4)见https://ci.apache.org/projects/flink/flink-docs-release-1.0/internals/general_arch.html#the-processes