当前位置: 首页 > 知识库问答 >
问题:

Flink中键控流中记录的排序

邓子濯
2023-03-14

我有一个记录按顺序到达的流。我应用了一个map函数,然后在上面应用了keyBy函数。在每个具有相同键的记录流中,记录的顺序是否会保持?

在按顺序排列记录方面也存在类似的问题。但是我对这里给出的答案和下面从链接“https://ci.apache.org/projects/flink/flink-docs-release-1.2/concepts/programming-model.html”中复制的描述感到困惑。

在给出的示例中,keyBy的子任务[2]同时从Map的子任务[1]和子任务[2]接收元素。如果只在子任务之间维护排序,那么如何保留每个键内的排序?

共有1个答案

查锦程
2023-03-14

keyBy操作仅维护来自同一子任务的事件的顺序。对于来自不同子任务的事件,Flink不会给你任何订单保证。

为了说明这一点,假设以下场景:您有两个映射子任务map1map2以及两个接收器子任务sink1sink2。在映射器和接收器之间有一个keyby操作。

map1生成以下事件序列(1,A),(2,B),(1,C),(2,D)map2生成(1,U),(1,V),(2,W),(2,X),其中第一个元组条目是我们的键。这意味着SINK1将接收集合{(1,A),(1,C),(1,U),(1,V)}SINK2接收集合{(2,B),(2,D),(2,W),(2,X)}

在不失一般性的前提下,让我们来看看sink1的序列顺序。您可以说的是,来自同一生成子任务的所有事件都按照它们被生成时的相同顺序到达。因此,(1,A)将先于(1,C)到达。但是,您不能说来自不同生成子任务的事件之间的顺序是什么。因此您不知道(1,A)是否先于(1,U)到达。

 类似资料:
  • 以下是我的一些疑问: 我有两个不同的流,元素按顺序排列。 1)现在,当我在这些流中的每一个上执行时,会维护顺序吗?(因为这里的每个组都将仅发送给一个任务管理器)我的理解是,记录将是一个组的顺序,在这里纠正我。 2) 在这两个流上执行按键操作后,我正在进行联合分组,以获取匹配和非匹配记录。这里也会维持秩序吗?,因为这也适用于KeyedStream。我正在使用事件时间(EventTime)和上升时间(

  • 问题内容: 我试图在Flink中的KeyedStream上执行映射操作: JsonToObjectMapper运算符的输出是 MessageObject 类的POJO,它具有String字段“ keyfield ”。然后,将流键入此字段。 MessageProcessorStateful是一个RichMapFunction,如下所示: 该代码引发NullPointer异常: 尽管我已经验证了’ke

  • 通过stream API,我可以编写一个RichCoFlatMapFunction来接受一个控制流和一个数据流,控制流中包含了启动、停止或改变参数的计算元素,我知道我可以存储当前控制设置的状态,并在处理数据流时检查值。 但是用Flink SQL做类似的事情的方法是什么呢?我不能使用join,因为数据流和控制流不能连接在一起。 我们提出的解决方案是通过应用程序本身存储控件设置。其想法是: > 将控制

  • 我需要用(userId)键控的缓慢变化的来丰富由(userId,startTripTimestamp)键控的快速变化的。 我使用带有数据流API的Flink1.8。我考虑两种方法: > 广播并通过用户ID和最新时间戳连接流。它是否等同于TableAPI中的DynamicTable?我可以看到这种解决方案的一些缺点:需要放入每个工作节点的RAM中,这会增加RAM的利用率,因为需要存储在每个工作节点的

  • 我对闪身是个新手。我正在尝试在我的应用程序中启用检查点和状态。我从Flink文档中看到了我们是如何存储键控状态的。但是我想知道我们是否可以存储非键控状态(的状态)

  • 我用Flink的table API创建了一个表。 当运行SQL以查看记录时,我得到: 我知道有一些坏的avro记录被推送到Kafka主题中。在JSON格式中,有一个选项可以通过设置来跳过/过滤这些记录。当从合流avro格式读取时,我们可以跳过这些记录吗? 这并不理想,但不幸的是,尽管有一个模式注册表,但我无法控制要推送到Kafka的内容。