开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

请问下有个Flink场景,我有两个不同数据类型的topic:a,b,这个有人遇到过吗?

请问下有个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,但是在下次切换的时候又出这种问题了

展开
收起
真的很搞笑 2023-11-21 08:11:49 58 0
3 条回答
写回答
取消 提交回答
  • 将b的source算子并行度设置为1,再通过map算子扩展为8个分区,再进行后面的watermark设置,开窗,jion操作。
    这要找到withidleness失效的原因,理论上不会出现这种问题,只要你给4个source都设置了withidleness,那要么一直有问题,要么一直没问题,不会说灰度一下就有问题了。

    解决的思路是,你不是有的并行度没数据吗,那我就在source这设置1个并行度,然后再分给多个并行度(随便怎么分,总之要保证eventtime均匀),这样这多个并行度的算子中就不会出现某一个没数据了。这个思路还是不如withidleness的方法好,eventtime均匀不是一个永远成立的条件。
    不要在datasource那添加watermark,在后面重开一个map算子,再添加watermark试试,此回答整理自钉群“【③群】Apache Flink China社区”

    2023-11-21 22:34:09
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    如果你在 Apache Flink 中使用了 left interval jointimestamp assigner 来进行灰度切换,并发现在灰度完成后水印停滞不前,可能的原因是:

    1. 数据迟到:你的右流数据可能会迟到,并且超出了 Flink 定义的时间窗口。
    2. 水印延迟:你的水印可能比实际事件时间慢得多,导致水印停止更新。
    3. 窗口长度:你可能设置了不正确的窗口长度,导致 Flink 没有足够的数据来进行 Join。

    你可以尝试以下解决方案:

    1. 检查数据来源:确保你的右流数据在灰度切换后按时到达。
    2. 调整水印设置:在 Flink SQL 中,你可以使用 watermark 关键字来调整水印策略,并允许一定程度的迟到数据。
    3. 调整窗口长度:增加窗口长度以覆盖更多数据。
    4. 更新 Flink 版本:升级 Flink 版本可以修复潜在的问题。

    此外,你还可以考虑使用 Checkpoint 来恢复数据,并减少数据延迟的影响。在 CheckpointConfig 类中,可以设置 checkpoint 的频率和位置,以减少数据丢失的风险。

    2023-11-21 14:13:45
    赞同 展开评论 打赏
  • 这个问题可能是由于Flink的Watermark机制导致的。Watermark是用来处理乱序事件的,当事件的时间戳超过Watermark时,Flink会将这些事件视为迟到事件,不进行处理。

    在你的场景中,可能是因为b和b_grey的主题只有四个分区有数据,所以这四个分区的Watermark会先到达,而其他四个分区的Watermark则会滞后。当全量切换完成后,b和b_grey的主题的所有分区的数据都会变为迟到事件,导致Watermark无法推进。

    解决这个问题的方法有以下几种:

    1. 调整Watermark的生成策略:你可以尝试调整Watermark的生成策略,使得每个分区的Watermark都能够及时更新。例如,你可以尝试使用BoundedOutOfOrdernessWatermarkGenerator,并设置合适的MaxOutstandingLateness和ClockSkewTolerance。

    2. 使用EventTimeIntervalJoin:在Flink SQL中,你可以使用EventTimeIntervalJoin来替代LeftIntervalJoin。EventTimeIntervalJoin会自动处理迟到事件,不需要手动设置Watermark。

    3. 增加数据重放:在全量切换完成后,你可以尝试将b和b_grey的主题的所有分区的数据都重新发送一次,以更新Watermark。

    2023-11-21 10:44:25
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载