写在前面
日常参考内容
更多详情,请参考
Flink窗口函数官网
更新日志
文章持续更新
09-13 解决事件时间无数据输出
09-15 更新窗口一些实践经验
11-21 更新传统group by和窗口group by有什么区别
实践纠正理解
窗口是如何计算的?
业务场景:去重(但rm <= 3)写入目标表
一开始理解是,窗口是从start到end,计算里面所有的数据,最终得到结果
思路是对的,数据是如何计算的呢,是一条条计算还是,一堆数据一起算呢?
数据是有序的,flink是数据推进的,没办法一起算,是一条条触发的,最终end时,提交到sink端。那意味着,如果sink端只能追加写,不能主键更新或者回撤机制(每次输出结果闪烁就是更新回撤嘞),就会导致数据没有达到去重效果,最终结果会出问题。
解决办法:
1、换掉sink端
2、坚持用flink的话,可修改对应业务场景(或增加新列,补充-D,+I操作)
3、使用中间件存储(但不保证端对端数据每次传输都在ms级别完成)
(1)group by和group by带窗口的有什么区别?
group by 字段 和 group by hop(…) 写法使用可以理解为
前者还是流计算,所以开启minibatch是可以攒批访问State的
后者可以理解为一个小阶段的批处理,不会来一条触发一次计算,而是时间触发计算,可能开启minibatch会导致没有太多效果在这个窗口上。
如何验证?待后续
滑动窗口
系统时间
-- kafka一开始写入测试的时候,时间戳有点乱,导致事件时间水位线推进混乱,无法出数据
DROP TEMPORARY TABLE IF EXISTS source_kafka01;
CREATE TEMPORARY TABLE source_kafka01 (
`user_id` STRING
,`uName` STRING
,`uId` BIGINT
,`ts` TIMESTAMP(3) METADATA FROM 'timestamp' VIRTUAL
-- 系统时间无需设置水位线
, `ts1` AS PROCTIME()
-- , WATERMARK FOR `ts` AS `ts` - INTERVAL '1' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'sk_test_01',
'properties.bootstrap.servers' = 'vpc:port',
'scan.startup.mode' = 'earliest-offset',
'key.fields' = 'user_id',
'key.format' = 'raw'
,'value.format' = 'json'
,'value.fields-include' = 'EXCEPT_KEY'
)
;
SELECT window_start, window_end, count(`user_id`) AS user_id_sum
FROM TABLE(
-- 定义1min滑动窗口
TUMBLE( TABLE source_kafka01
,DESCRIPTOR(`ts1`)
,INTERVAL '10' SECOND))
GROUP BY window_start, window_end;
Event Time
无数据排查思路
先描述一下产生环境
在我未使用group by的时候,数据是可以输出的
在使用group by的时候,数据无输出
排查步骤(错误思路哈,准确的来说是折腾思路)
1、怀疑简单的select在VVP平台无法输出数据
(1)写入holo中,也可以输出到print
-- DROP TEMPORARY TABLE IF EXISTS sink_hologres;
-- CREATE TEMPORARY TABLE sink_hologres (
-- `window_start` BIGINT,
-- `window_end` BIGINT,
-- `user_id_sum` BIGINT
-- ) WITH (
-- 'connector'='hologres',
-- 'dbname'='test_sk',
-- 'tablename'='test04',
-- 'username' = 'xxx',
-- 'password' = 'xxxxx',
-- -- 使用指定vpc网络,经典网络使用失败
-- 'endpoint'='vpc:port'
-- );
-- INSERT INTO sink_hologres
-- SELECT UNIX_TIMESTAMP(cast(window_start as string)), UNIX_TIMESTAMP(cast(window_end as string)), cast(count(`user_id`) as bigint ) AS user_id_sum
-- FROM TABLE(
-- -- 定义10s滑动窗口
-- TUMBLE( TABLE source_kafka01
-- ,DESCRIPTOR(`ts`)
-- ,INTERVAL '5' SECOND))
-- GROUP BY window_start, window_end;
(2)任务上线
依旧没数据
2、基于1.(2) 拆分节点
-- 配置选项中加入
pipeline.operator-chaining: 'false'
发现全局窗口无法关闭,无水位线推进
3、排查数据问题
是否kafka数据更新导致乱序?
1)未知kafka如何删除topic数据,消息队列应该是无法清除数据的
2)使用新的topic,间歇性写入数据
4、想查一下全局窗口怎么算水位线的
参考链接
1)kafka分区有空区,新建topic,修改分区数为2
2)flink的并发也设置为2(分区数要和并行度相同)
!!具体flink处理源码,水准有限,后期持续更近