SQL 深度检查能力是一项 SQL 引擎侧的增强能力,旨在提升产品的易用性。深度检查能够在校验阶段,提前检查作业的 SQL 语法语义、网络连通性以及作业使用的表的元数据信息,并提示 SQL 风险问题,给出对应的 SQL 优化建议,对云上用户 Flink SQL 的日常使用、深度使用有较大的帮助。
深度检查包含如下功能:
在 Flink 1.16 & 1.17 SQL 任务中,点击“验证”按钮后,如下:
点击后会弹出一个选择框,点选“开启深度检查”,并根据作业版本,选择对应资源池的 Session 集群,之后点击深度检查:
校验结果展示:
分析常见的语法语义问题,并给出报错原因和解决方案。
校验结果展示:
目前已支持的报错类型如下:
校验报错类型 | 报错原因 |
|---|---|
SQL-Syntax-Error | 不符合 SQL 语法规则,报错的位置在第 ${2} 行第 ${3} 列的 ${1} |
Old-Begin-Statement-Set-Not-Support | 一般是使用了 BEGIN STATEMENT SET ... END 这种被社区废弃的语法,一般来自于从其它厂商搬迁的 SQL |
Table-Name-Not-Found | ${5} 表或视图不存在,报错的文本位置是从第 ${1} 行第 ${2} 列到第 ${3} 行第 ${4} 列 |
Column-Name-Not-Found | ${5} 列不存在,报错的文本位置是从第 ${1} 行第 ${2} 列到第 ${3} 行第 ${4} 列 |
Function-Argument-Type-Mismatch | ${1} 函数入参类型不匹配。当前的入参类型为 ${2},支持的入参类型为 ${3} |
Function-Argument-Number-Mismatch | ${1} 函数入参个数不匹配,预期入参个数是 ${2} |
Function-Not-Found | ${1} 函数不存在,报错的文本位置是从第 ${1} 行第 ${2} 列到第 ${3} 行第 ${4} 列 |
Illegal-Use-of-NULL | 不支持 untyped NULL literal,报错的文本位置是从第 ${1} 行第 ${2} 列到第 ${3} 行第 ${4} 列 |
Union-Type-Mismatch | 不支持 UNION 隐式类型转换,报错的文本位置是从第 ${1} 行第 ${2} 列到第 ${3} 行第 ${4} 列 |
Query-Sink-Columns-Number-Mismatch | ${1} 表的查询和写入 Sink 的字段个数不一致 |
Query-Sink-Columns-Type-Incompatible | ${1} 表的查询和写入 Sink 的第 ${2} 个字段 ${3} 类型不一致 |
Metadata-Key-Not-Found | 表 ${3} 的元数据列 ${1} 不存在 |
Connector-Option-Not-Support | ${1} connector option 不支持 ${2} |
Connector-SPI-Not-Found | Connector SPI 查找时,没找到 Connector identifier ${1} 对应的 DynamicTableFactory class |
Query-Sink-Schema-Mismatch | ${1} 表的查询和写入 Sink 的字段个数不一致,以及列类型是否一致 |
Implicit-Type-Conversion-Not-Support | ${1} 和 ${2} 的隐式类型转换不支持 |
会检测各 Connector 数据源 endpoint 的 ip 和 port 的网络连通性,如果网络访问不通,则快速报错。会先对所有 ip 进行检测,如果 ip 连通失败,则直接报错。如果 ip 都能连通,则继续检测所有 ip 和 port 的组合,如果连通失败,则直接报错,反之,则正常通过。
报错提示信息:
目前已覆盖常见的 15 种 Connector:
Connector 类型 | Serverless Flink 1.16 | Serverless Flink 1.17 |
|---|---|---|
kafka | 支持 | 支持 |
upsert-kafka | 支持 | 支持 |
jdbc | 支持 | 支持 |
mysql-cdc | 支持 | 支持 |
mongo-cdc | 支持 | 支持 |
postgres-cdc | 支持 | 支持 |
sqlserver-cdc | 支持 | 支持 |
bytehouse-cdw | 支持 | 支持 |
bytehouse-ce | 支持 | 支持 |
redis(single-node 模式) | 支持 | 支持 |
redis(cluster 模式) | 支持 | 支持 |
hbase-1.4 | 支持 | 支持 |
hbase-2.2 | 支持 | 支持 |
elasticsearch-6 | 支持 | 支持 |
elasticsearch-7 | 支持 | 支持 |
starrocks | 支持 | 支持 |
doris | 支持 | 支持 |
rocketmq | 支持 | 支持 |
目前支持两种正确性和优化建议的检测,分别是 NDU 正确性问题和两阶段聚合优化建议。
建议类型 | 具体原因 |
|---|---|
NDU 正确性问题 | 当前作业存在数据的非确定性更新风险。常见原因包括:1.使用了不确定函数,包括标量、表值、聚合类型的内置或自定义函数,例如 RANDOM、UUID、CURRENT_TIMESTAMP 等;2.在一个变化的源表上进行 Lookup Join;3.CDC 源表携带了元数据字段(系统列,不属于物理列)。非确定性更新可能会导致产生的数据存在正确性风险。为避免这种情况,我们建议您采纳以下建议 |
两阶段聚合优化建议 | 当前作业建议开启两阶段聚合优化,通过本地预聚合,减少下游全局聚合算子处理的数据量,提升作业的聚合性能,并缓解热点问题,具体操作步骤见如下建议 |
校验结果展示: