当在使用flinksql的left join出现撤回流该如何解决?

目录

撤回流怎么出现的?

如何解决撤回流?

还有哪些join会产生撤回流?

例子

[INNER JOIN](#INNER JOIN)

[RIGHT JOIN](#RIGHT JOIN)

[FULL OUTER JOIN](#FULL OUTER JOIN)

总结


在Flink SQL中,LEFT JOIN 操作会产生一个撤回流(retraction stream),这是因为流数据处理的特点使然。

撤回流怎么出现的?

当使用 LEFT JOIN 时,如果在右侧流中的某个键的关联值发生变化,Flink 会生成一个撤回消息来撤销之前的关联值,并发送一个新的消息来更新最新的关联值。这是为了确保最终结果是正确的。

举个简单的例子来说明这一点:

假设有两个流 A 和 B:

流 A (key, value):

(1, "A1")

(2, "A2")

流 B (key, value):

(1, "B1")

(2, "B2")

(2, "B3")

执行 LEFT JOIN 后的输出流可能如下:

  1. 对于 A 流中的 (1, "A1")

    • 关联到 B 流中的 (1, "B1"),输出 (1, "A1", "B1")
  2. 对于 A 流中的 (2, "A2")

    • 首先关联到 B 流中的 (2, "B2"),输出 (2, "A2", "B2")
    • 当 B 流中 (2, "B3") 出现时,Flink 会撤回之前的 (2, "A2", "B2"),并输出新的 (2, "A2", "B3")

因此,撤回流在这样的场景中非常重要,它确保了下游算子或接收者能够获得正确和最新的数据状态。

撤回流的引入使得处理流式数据时可以确保数据一致性和正确性,但同时也需要在设计和实现时考虑到撤回流对性能和资源的影响

注意:出现撤回流,当把数据写入kafka的时候为什么只能使用upsertkafka,不能普通的kafkasink

如何解决撤回流?

在Flink SQL中,使用 LEFT JOIN 操作产生撤回流(retraction stream)时,确实需要使用 upsert-kafka connector 将数据写入 Kafka。这是因为 upsert-kafka connector 能够正确处理更新和删除操作,保证数据的一致性和准确性。

这是因为:

  1. 撤回流的处理

    • 撤回流会产生删除和更新操作,而普通的 Kafka sink(如 kafka connector)只支持追加(append)操作,无法处理更新和删除。
    • upsert-kafka connector 支持 UPSERT 语义,可以根据主键(key)来更新或删除记录。
  2. 数据一致性

    • 使用普通的 kafka connector,当数据需要更新或删除时,无法保证 Kafka 中的数据与 Flink 处理后的数据一致。
    • upsert-kafka connector 会自动根据主键(key)来确定是否需要插入新记录、更新现有记录或删除记录,从而保证数据的一致性。
  3. 主键的支持

    • upsert-kafka 依赖主键来识别记录,确保可以正确地进行更新或删除操作。
    • 在写入 Kafka 时,upsert-kafka 会根据指定的主键来进行相应的操作,从而实现数据的幂等性和一致性。

简而言之,upsert-kafka connector 能够处理复杂的流处理语义,确保撤回流中涉及的更新和删除操作被正确执行,保证数据的一致性和准确性。这是普通的 Kafka sink 无法实现的,因此在处理包含撤回流的操作时,使用 upsert-kafka connector 是必要的。

还有哪些join会产生撤回流?

在 Flink SQL 中,除了 LEFT JOIN,其他一些 JOIN 操作也会产生撤回流。具体来说,以下 JOIN 操作可能会导致撤回流的产生:

  1. INNER JOIN

    • INNER JOIN 会在两个表中找到匹配的记录并进行关联。当其中一张表的数据发生变化(插入、更新或删除)时,Flink 需要撤回之前的结果,并输出新的结果。
  2. RIGHT JOIN

    • 类似于 LEFT JOINRIGHT JOIN 会保留右表中的所有记录,并将左表中匹配的记录关联上。当右表中的数据发生变化时,撤回流会被触发以保证结果的一致性。
  3. FULL OUTER JOIN

    • FULL OUTER JOIN 会保留左右两表中的所有记录,并将匹配的记录进行关联。当任一表中的数据发生变化时,撤回流会被触发以更新最终的关联结果

例子

举例说明这些 JOIN 操作产生撤回流的情况:

INNER JOIN

假设有两个表 A 和 B:

表 A: (key, value)

(1, "A1")

(2, "A2")

表 B: (key, value)

(1, "B1")

(2, "B2")

执行 INNER JOIN 后:

  1. 对于 A 表中的 (1, "A1") 和 B 表中的 (1, "B1"),输出 (1, "A1", "B1")
  2. 对于 A 表中的 (2, "A2") 和 B 表中的 (2, "B2"),输出 (2, "A2", "B2")

如果 B 表中键为 2 的记录更新为 (2, "B3"),Flink 需要撤回 (2, "A2", "B2"),并输出新的 (2, "A2", "B3")

RIGHT JOIN

类似于 LEFT JOIN,但保留右表中的所有记录。

FULL OUTER JOIN

保留左右两表中的所有记录。当任意一张表的数据发生变化时,都会触发撤回流

总结

在 Flink SQL 中,INNER JOINRIGHT JOINFULL OUTER JOIN 操作会因为数据变化而产生撤回流。这是为了确保流处理的结果一致性和准确性。在设计流处理应用时,需要考虑这些撤回流的影响,选择合适的 sink connector,例如 upsert-kafka,以正确处理这些操作。

相关推荐
大霸王龙20 分钟前
软件工程的软件生命周期通常分为以下主要阶段
大数据·人工智能·旅游
点赋科技1 小时前
沙市区举办资本市场赋能培训会 点赋科技分享智能消费新实践
大数据·人工智能
YSGZJJ1 小时前
股指期货技术分析与短线操作方法介绍
大数据·人工智能
Doker 多克1 小时前
Flink CDC —部署模式
大数据·flink
Guheyunyi1 小时前
监测预警系统重塑隧道安全新范式
大数据·运维·人工智能·科技·安全
酷爱码2 小时前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
问道飞鱼2 小时前
Flink 高可用集群部署指南
flink·部署·批处理·流式批处理
Channing Lewis3 小时前
如果科技足够发达,是否还需要维持自然系统(例如生物多样性)中那种‘冗余’和‘多样性’,还是可以只保留最优解?
大数据·人工智能·科技
禺垣3 小时前
区块链技术概述
大数据·人工智能·分布式·物联网·去中心化·区块链