当在使用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,以正确处理这些操作。

相关推荐
Stringzhua1 小时前
【SpringCloud】Kafka消息中间件
spring·spring cloud·kafka
Qspace丨轻空间2 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
Elastic 中国社区官方博客3 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
Aloudata4 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表4 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
拓端研究室TRL7 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗7 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁7 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式8 小时前
大数据治理:确保数据的可持续性和价值
大数据
杨荧8 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka