flink 1.16 sql gateway 测试记录

本文记录了Flink 1.16版本中SQL Gateway的测试过程。总结了只能逐条执行SQL或SET命令的特点,它作为Flink SQL的代理,建议通过代码封装以提高使用便捷性。执行失败时返回的堆栈信息不易阅读,推荐查看日志。此外,单独部署时需确保配置和集群一致,否则可能出现类找不到的错误。执行结果的展示不够直观,如SELECT语句缺少列名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flink 1.16 sql gateway 测试简单记录

总结

  • 从能搜索到的文档看,一次只能执行一条sql或者set 之类的命令
  • 本质就是flink sql的 proxy ,文档也是如此描述
  • 通过curl 直接使用还是不方便,应该考虑使用代码进行封装
  • 执行失败会返回后台堆栈,但不自行格式化很难阅读,同时还是建议去看后台log
  • 虽然是proxy性质,单独部署时候配置和lib需要和cluster其它节点保持一致,否则会有class找不到之类的错误
  • 执行结果有点奇怪,有点难阅读,比如select 输出没有column name

执行记录

curl --request POST http://localhost:8083/v1/sessions |jq |grep sessionHandle|awk -F
<think>在Flink 1.16中,处理迟到数据主要依靠**事件时间语义**和**水印(Watermark)**机制,并结合窗口的**允许延迟(allowed lateness)**和**侧输出(side output)**功能。以下是具体实现方法: --- ### 1. **定义水印策略** 水印用于表示事件时间的进展,并容忍一定程度的乱序。在Flink SQL中,可以在创建表时定义水印策略: ```sql CREATE TABLE orders ( order_id STRING, amount DECIMAL(10, 2), order_time TIMESTAMP(3), WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND -- 允许5秒的乱序 ) WITH (...); ``` - `WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND` 表示系统允许事件时间比水印时间晚5秒。 --- ### 2. **使用窗口函数并设置允许延迟** 在窗口聚合(如`TUMBLE`、`HOP`)中,通过`GROUP BY`子句指定窗口,并设置`ALLOWED_LATENESS`来定义窗口关闭前的最大延迟时间: ```sql INSERT INTO result_table SELECT TUMBLE_END(order_time, INTERVAL '1' HOUR) AS window_end, SUM(amount) AS total_revenue FROM orders GROUP BY TUMBLE(order_time, INTERVAL '1' HOUR) -- 滚动窗口1小时 ALLOWED_LATENESS (INTERVAL '10' MINUTE); -- 允许迟到10分钟 ``` - **允许延迟机制**:窗口不会在水印到达窗口结束时间后立即关闭,而是会继续等待`10`分钟。在此期间到达的迟到数据,会触发窗口的**增量更新**(即重新计算并输出新结果)。 --- ### 3. **使用侧输出捕获迟到数据** 对于超过允许延迟的极端迟到数据,可通过`EMIT`语法(Flink 1.16新增)输出到独立的侧输出流: ```sql INSERT INTO result_table SELECT TUMBLE_END(order_time, INTERVAL '1' HOUR) AS window_end, SUM(amount) AS total_revenue FROM orders GROUP BY TUMBLE(order_time, INTERVAL '1' HOUR) WITH ( 'allow-lateness' = '10min', -- 允许迟到10分钟 'emit-mode' = 'allow-lateness-and-retract' -- 允许延迟并支持撤回 ); ``` - **侧输出流**:超过允许延迟的数据会被路由到侧输出表(需提前定义),避免污染主结果流。 --- ### 完整示例 #### Step 1: 创建源表(含水印) ```sql CREATE TABLE orders ( order_id STRING, amount DECIMAL(10, 2), order_time TIMESTAMP(3), WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'orders', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); ``` #### Step 2: 创建结果表 ```sql CREATE TABLE revenue_report ( window_end TIMESTAMP(3), total_revenue DECIMAL(10, 2) ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://localhost:3306/flink', 'table-name' = 'revenue' ); ``` #### Step 3: 执行聚合(允许延迟10分钟) ```sql INSERT INTO revenue_report SELECT TUMBLE_END(order_time, INTERVAL '1' HOUR) AS window_end, SUM(amount) AS total_revenue FROM orders GROUP BY TUMBLE(order_time, INTERVAL '1' HOUR) ALLOWED_LATENESS (INTERVAL '10' MINUTE); ``` --- ### 关键点说明 1. **水印**:定义了事件时间的进度和乱序容忍度(如5秒)。 2. **允许延迟(`ALLOWED_LATENESS`)**:窗口会额外等待一段时间(如10分钟),期间迟到数据触发结果更新。 3. **侧输出**:超过允许延迟的数据单独处理,避免影响主流程[^1][^3]。 --- ### 相关问题 1. Flink SQL中水印延迟设置对窗口计算有何影响? 2. 如何配置Flink SQL作业以处理超过允许延迟的极端迟到数据? 3.Flink 1.16中,`EMIT`语法的具体使用场景有哪些? 4. 如何验证Flink SQL窗口聚合结果的准确性?</think>在 Flink 1.16 SQL 中处理迟到数据主要通过 **水印(Watermark)** 机制和 **允许延迟(Allowed Lateness)** 功能实现,以下是完整实现方案: ### 1. 定义水印策略 在创建表时使用 `WATERMARK` 子句定义水印策略,允许数据延迟到达: ```sql CREATE TABLE orders ( order_id STRING, amount DECIMAL(10, 2), order_time TIMESTAMP(3), WATERMARK FOR order_time AS order_time - INTERVAL '2' MINUTE -- 允许2分钟延迟 ) WITH ( 'connector' = 'kafka', 'topic' = 'orders', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); ``` - `WATERMARK FOR order_time AS order_time - INTERVAL '2' MINUTE` 表示系统允许事件时间比水印时间晚2分钟到达[^2] ### 2. 使用允许延迟功能 在窗口聚合时添加 `ALLOWED_LATENESS` 子句处理迟到数据: ```sql INSERT INTO revenue_report SELECT HOP_END(order_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) AS window_end, SUM(amount) AS total_revenue FROM orders GROUP BY HOP(order_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) ALLOWED_LATENESS (INTERVAL '5' MINUTE); -- 额外允许5分钟延迟 ``` - **窗口行为**: - 主窗口:每10分钟计算一次(窗口大小) - 滑动间隔:每5分钟触发一次计算 - 允许延迟:窗口关闭后额外等待5分钟处理迟到数据 ### 3. 完整示例(每5分钟计算,每10分钟输出) ```sql -- 创建结果表 CREATE TABLE revenue_report ( window_end TIMESTAMP(3), total_revenue DECIMAL(10, 2) ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://localhost:3306/flink', 'table-name' = 'revenue' ); -- 处理迟到数据的聚合查询 INSERT INTO revenue_report SELECT HOP_END(order_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) AS window_end, SUM(amount) AS total_revenue FROM orders GROUP BY HOP(order_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) ALLOWED_LATENESS (INTERVAL '5' MINUTE); ``` ### 迟到数据处理机制 1. **首次计算结果**:在窗口结束时间(如10:10)立即输出 2. **延迟数据到达**:窗口关闭后5分钟内到达的数据(允许延迟期内) 3. **更新结果**:Flink 会输出一条**撤回消息**(retract)和**更新后的结果** 4. **最终关闭**:水印超过 `窗口结束时间 + 允许延迟` 后窗口永久关闭 ### 验证结果准确性 可通过查询系统表验证迟到数据处理: ```sql SELECT * FROM TABLE( DESCRIBE_STATEMENT( 'INSERT INTO revenue_report...' -- 替换为实际INSERT语句 ) ); ``` ### 注意事项 1. **水印生成**:确保使用事件时间(`TIMESTAMP(3)` 类型) 2. **状态保留**:允许延迟会增加状态存储时间 3. **结果更新**:下游系统需支持撤回/更新(如JDBC、Upsert Kafka) 4. **极端延迟**:超过允许延迟的数据会被丢弃(可通过侧输出捕获)[^1][^3] > **提示**:在 Flink 1.16 中,Python UDF 支持得到增强,可通过 JNI 在 JVM 中执行自定义函数[^4],适用于复杂迟到数据处理逻辑。 --- ### 相关问题 1. Flink SQL 中如何配置水印延迟时间以优化迟到数据处理? 2.Flink 1.16 中,如何实现窗口聚合结果的撤回和更新? 3. 如何处理超过允许延迟时间的极端迟到数据? 4. Flink SQL 的 `HOP` 窗口与 `CUMULATE` 窗口在处理迟到数据时有何区别? 5. 如何监控 Flink SQL 作业中迟到数据的处理情况?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40455124

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值