0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是 Flink SQL 解决不了的问题?

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-09 20:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

在实时数据开发过程中,大家经常会用 Flink SQL 或者 Flink DataStream API 来做数据加工。通常情况下选用2者都能加工出想要的数据,但是总会有 Flink SQL 覆盖不了的问题,但 SQL 的易用性又难以让人释怀。所以有些场景在使用 FLink SQL 开始就与需要额外注意,下面就介绍一种多表关联时存在部分列更新(partial Update)场景,在 DataStream API 和 Flink SQL 开发时都容易忽视的情况而导致的问题。为了简化问题描述,采用了Flink SQL 来阐述此类问题。

场景介绍

多表关联时表 A 关联表 B, 表 A 具有pk1, field1, field2, field3字段,表 B 具有 pk2, field4, field5, field6 字段,表 A 通过 pk1 关联表B pk2。使用 Flink SQL 会如下实现:

CREATE TABLE jdq_source(
pk1 INT,
field1 STIRNG,
field2 STIRNG,
field3 STIRNG,
PRIMARY KEY(pk1) NOT ENFORCED
) WITH(...);

CREATE TABLE sr_sink(
pk1 INT,
field1 STRING,
field2 STRING,
field3 STRING,
field4 STRING,
field5 STRING,
field6 STRING,
PRIMARY KEY(pk2) NOT ENFORCED
) WITH (...);

INSERT INTO C
SELECT A.pk1,A.field1,A.field2,A.field3,B.pk2,B.field4,B.field5,B.field6 FROM jdq_source A
INNER JOIN sr_sink B
ON A.pk1 = B.pk2;

上述实例中有明显特征:使用了Join 关联, 且需要注意的是写入的数据库 sink 是 StarRocks。StarRocks 存在如下特性:当表是主键表时是不支持部分列更新( Partial Update)的,实际上大部分时候大家都用的是主键表。

然后在一个SQL查询数据的接口就遇到了如下问题:每次从接口查询返回的结果都不稳定,同样的查询条件不同时机返回的结果不一样。SQL查询语句如下:

select C.field1,C.field2,C.field3
FROM C group by field1,field2,field3;
为什么SQL查询的结果会不一致呢?起初排查原因发现 group by 返回结果有多条,而在SQL 中也没有使用 order by 对数据进行排序,所以导致了结果不稳定。后又排查为什么会出现多条结果呢?于是怀疑 field1, field2, field3 有不符合预期的数据。如: 

20240530, 2, 3
20240530, 2, null
20240531, 2, 4

其中第2条是多余的,不应该出现。结果发现可能是如下原因导致的:这3个字段 filed1, field2, filed3 在StarRocks数据库中会一直在变化,不停的写入新值。导致 SQL 查询时可以查到 field3 为 null 的数据。
为什么field3为不断变化呢?究其原因是:StarRocks 主键表不支持部分列更新(Partial Update)。当field3 为null时,同样会被写入 StarRocks。我们在通过JDQ读取表A field1, field2, field3 数据给表C写入数据时,当JDQ 消息队列中表A的记录存在乱序场景且field3 字段可能为null时,最终写入StarRocks的field3 字段会出现时而为null,时而不为null。 所以SQL查询接口中 group by的结果会出现不稳定。

总结

为什么在开发的时候当时没有发现 StarRocks 主键表这个问题呢?原因:1. 大家所关注的部分列更新,多数是关注insert into table_C(field1, field2, field3) 中不包含的字段field4,field5...等被更新为null,而当前场景是会把 field3 为null的值也写入SR数据库中,这不是我们期望的结果。2.表A作为主表,通常不会出现开始field3有值后来又没有值(null)的场景。出现这个现象大概率是因为上游JDQ消息队列中的数据乱序了,导致field3 为null的后出现了。而这种问题又比较难发现。

什么情况下会出现此类问题呢?写入的数据库不支持部分列更新场景时会出现。如StarRocks, Doris。因为MySQL, ES,ClickHouse的部分表引擎支持部分列更新,所以在MySQL, ES,ClickHouse中不会出现。

同理在 DataStream API 中如果表 A,表 B 关联后的数据直接写入StarRocks 的话,也会出现此类问题。
以上这个问题在 Flink SQL 中无法解决,在 Flink DataStream API 中可以模拟部分列更新来避免此类问题。具体方法:在DatStream 任务中增加一个MapState, 用来在新数据到来时从MapState拿出缓存的数据,并和新到来的数据进行合并,来实现部分列更新功能,最后再写入 StarRocks。
虽然问题不是Flink SQL导致的,但是上面的问题可以通过Flink DataStream API来规避。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    809

    浏览量

    47023
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    怎么判断一条 SQL 到底慢在哪?NineData SQL 智能优化能解决什么

    SQL 变慢最怕的不是慢本身,而是大家一开始只能靠猜。明明语法没报错,业务一上线却卡住了;多了一个函数、少了一个索引,或者关联顺序不合适,就可能让数据库白白扫描一大堆数据。在很多团队里,这类问题最早
    的头像 发表于 05-19 18:43 137次阅读
    怎么判断一条 <b class='flag-5'>SQL</b> 到底慢在哪?NineData <b class='flag-5'>SQL</b> 智能优化能解决什么

    一文读懂 SASE 零信任:云时代网络安全的破局之道

    、出差时的访问需求,和数据安全的底线反复拉扯……不是你的安全投入不够,而是用传统“城堡式”的边界安全思路,根本解决不了云时代的安全问题。而SASE零信任,正是当下企
    的头像 发表于 05-09 11:22 510次阅读
    一文读懂 SASE 零信任:云时代网络安全的破局之道

    NineData SQL AI 智能补全上线:写 SQL,不必每次都从头敲

    NineData推出SQLAI智能补全功能,通过AI技术实现上下文感知的SQL语句智能提示。该功能不仅能补全关键字,还能根据当前输入内容预测后续查询意图,显著提升多表关联、复杂条件等场景下的编写效率
    的头像 发表于 04-01 20:19 367次阅读
    NineData <b class='flag-5'>SQL</b> AI 智能补全上线:写 <b class='flag-5'>SQL</b>,不必每次都从头敲

    SQL分析选型:DMS/DAS与NineData该如何选择

    阿里云 DMS 的慢SQL 趋势、DAS 的 SQL 审计能力成熟,可满足阿里云用户基础需求。NineData 侧重跨云统一工作台、研发与 DBA 协同,打通慢日志分析、性能诊断、规范审核、索引建议全链路,更适配企业级慢查询持续治理。
    的头像 发表于 03-25 17:20 1591次阅读
    慢<b class='flag-5'>SQL</b>分析选型:DMS/DAS与NineData该如何选择

    NineData 社区版的慢SQL分析,比查看日志+看EXPLAIN适合中小团队

    本文探讨 NineData 社区版在 MySQL 慢 SQL 场景对中小团队的适用性。与 “查看日志 + 看 EXPLAIN” 传统方式不同,它将慢 SQL 按模板聚合,能从大盘、模板、诊断等多维
    的头像 发表于 03-17 14:07 185次阅读
    NineData 社区版的慢<b class='flag-5'>SQL</b>分析,比查看日志+看EXPLAIN适合中小团队

    MySQL 慢 SQL 排查这件事,NineData 社区VS DBeaver/ Navicat 技术分析

    DBeaver Community 和 Navicat Premium Lite 都是很有价值的客户端工具,在单条 SQL 的查询和验证上,依然是 DBA 最顺手的入口。 但 NineData
    的头像 发表于 03-17 11:53 203次阅读
    MySQL 慢 <b class='flag-5'>SQL</b> 排查这件事,NineData 社区VS DBeaver/ Navicat 技术分析

    TCP三次握手与四次挥手的详细过程

    ——SYN_RECV 队列溢出怎么排查?TIME_WAIT 堆积几万个怎么处理?RST 到底是谁发的?这些问题光靠背书解决不了
    的头像 发表于 02-25 10:38 532次阅读

    VSCODE+ESP-IDF运行\'\'hello world\",partition-table进程卡住

    变化,不知道是什么原因,软件卸载重装都试过,网上的好多方法都试过,就是解决不了,一直卡在这里,特别奔溃,请大佬指点一下!!!!
    发表于 12-28 22:09

    使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025构建高性能AI应用

    在 Microsoft Ignite 2025 大会上,随着 Microsoft SQL Server 2025 的发布,AI 就绪型企业数据库愿景成为现实,为开发者提供强大的新工具,例如内置向量
    的头像 发表于 12-01 09:31 1185次阅读
    使用NVIDIA Nemotron RAG和Microsoft <b class='flag-5'>SQL</b> Server 2025构建高性能AI应用

    使用env v2.0执行scons --dist产生缺失依赖报错怎么解决?

    报错;详情请看图片,我尝试了从github上拉取最新的packages的包到本地bsp的工程中,但是依旧解决不了问题。
    发表于 09-11 08:28

    SQL 通用数据类型

    SQL 通用数据类型 数据库表中的每个列都要求有名称和数据类型。Each column in a database table is required to have a name and a
    的头像 发表于 08-18 09:46 932次阅读

    数据库数据恢复—SQL Server数据库被加密如何恢复数据?

    SQL Server数据库故障: SQL Server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。
    的头像 发表于 06-25 13:54 929次阅读
    数据库数据恢复—<b class='flag-5'>SQL</b> Server数据库被加密如何恢复数据?

    KT6368A 蓝牙芯片通过 FCC、BQB、KC、CE 等认证的操作指南

    固件 RF=7_20240718”,BQB 用 “KT6328A_F510_BQB_认证固件_20220419.fw”。烧录后替换原芯片即可测试,可参考相关文档,认证不通过多因硬件问题,解决不了可联系协助解决
    的头像 发表于 06-18 13:44 1442次阅读
    KT6368A 蓝牙芯片通过 FCC、BQB、KC、CE 等认证的操作指南

    达梦数据库常用管理SQL命令详解

    达梦数据库常用管理SQL命令详解
    的头像 发表于 06-17 15:12 7834次阅读
    达梦数据库常用管理<b class='flag-5'>SQL</b>命令详解

    大促数据库压力激增,如何一眼定位 SQL 执行来源?

    你是否曾经遇到过这样的情况:在大促活动期间,用户访问量骤增,数据库的压力陡然加大,导致响应变慢甚至服务中断?更让人头疼的是,当你试图快速定位问题所在时,却发现难以确定究竟是哪个业务逻辑中的 SQL
    的头像 发表于 06-10 11:32 715次阅读
    大促数据库压力激增,如何一眼定位 <b class='flag-5'>SQL</b> 执行来源?