Flink窗口学习

写在前面

日常参考内容

更多详情,请参考
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处理源码,水准有限,后期持续更近
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值