请问下有个Flink场景,我有两个不同数据类型的topic:a,b,他们分别又有相同数据类型的后缀为_grey的灰度用的topic: a_grey,b_grey
a_grey和b_grey分别是用来对应a,b进行灰度切换的,灰度流程是先灰度部分数据,后面全量切换,a -> a_grey, b -> b_grey,下一次灰度就是b_grey -> b, a_grey -> a。
我会用datastream api,去拉取a,a_grey进行union,withTimestampAssigner,使用事件时间戳
用datastream api,去拉取b,b_grey进行unionr,使用事件时间戳
然后去将union之后的stream转换为table,a_union_table和b_union_table 然后用flink sql进行left interval join,a_union_table left interval join b_union_table,获取数据再转为stream,用stream api进行mapper操作,最后写入数据库。
a,a_grey,b,b_grey都有8个分区,
a和a_grey会发送到所有的8个分区有数据
但是b,b_grey,只会发送到里面四个分区,其他四个分区没有数据
现在的问题是每次灰度全量切换完成之后,flink的水印就会推进不了,停留在切换的kafka数据时间戳附近,推进不了,请问下,这个有人遇到过吗?是什么原因,可以怎么解决?flink 1.17.1和1.14.5都不行
我尝试过withIdleness,或者不用withTimestampAssigner,但是在下次切换的时候又出这种问题了
将b的source算子并行度设置为1,再通过map算子扩展为8个分区,再进行后面的watermark设置,开窗,jion操作。
这要找到withidleness失效的原因,理论上不会出现这种问题,只要你给4个source都设置了withidleness,那要么一直有问题,要么一直没问题,不会说灰度一下就有问题了。
解决的思路是,你不是有的并行度没数据吗,那我就在source这设置1个并行度,然后再分给多个并行度(随便怎么分,总之要保证eventtime均匀),这样这多个并行度的算子中就不会出现某一个没数据了。这个思路还是不如withidleness的方法好,eventtime均匀不是一个永远成立的条件。
不要在datasource那添加watermark,在后面重开一个map算子,再添加watermark试试,此回答整理自钉群“【③群】Apache Flink China社区”
如果你在 Apache Flink 中使用了 left interval join
和 timestamp assigner
来进行灰度切换,并发现在灰度完成后水印停滞不前,可能的原因是:
你可以尝试以下解决方案:
watermark
关键字来调整水印策略,并允许一定程度的迟到数据。此外,你还可以考虑使用 Checkpoint 来恢复数据,并减少数据延迟的影响。在 CheckpointConfig
类中,可以设置 checkpoint 的频率和位置,以减少数据丢失的风险。
这个问题可能是由于Flink的Watermark机制导致的。Watermark是用来处理乱序事件的,当事件的时间戳超过Watermark时,Flink会将这些事件视为迟到事件,不进行处理。
在你的场景中,可能是因为b和b_grey的主题只有四个分区有数据,所以这四个分区的Watermark会先到达,而其他四个分区的Watermark则会滞后。当全量切换完成后,b和b_grey的主题的所有分区的数据都会变为迟到事件,导致Watermark无法推进。
解决这个问题的方法有以下几种:
调整Watermark的生成策略:你可以尝试调整Watermark的生成策略,使得每个分区的Watermark都能够及时更新。例如,你可以尝试使用BoundedOutOfOrdernessWatermarkGenerator,并设置合适的MaxOutstandingLateness和ClockSkewTolerance。
使用EventTimeIntervalJoin:在Flink SQL中,你可以使用EventTimeIntervalJoin来替代LeftIntervalJoin。EventTimeIntervalJoin会自动处理迟到事件,不需要手动设置Watermark。
增加数据重放:在全量切换完成后,你可以尝试将b和b_grey的主题的所有分区的数据都重新发送一次,以更新Watermark。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。