这边数据源用无界流会不会好些?

来源:10-5 功能一之实现03

MagicPenta

2021-09-08

PK 老师您好,冒昧打扰。

TopN 这个示例新增了一个 ProcessFunction 中的 Timer 知识点,用文本流来展示 demo 感觉会有 误导 的效果。在使用文本流的情况下,因为数据流是有界的,无论我在 registerEventTimeTimer(...) 中设置时间戳为何值,onTimer(...) 方法都会被触发。这就使我产生了疑惑,Timer 是由谁触发的?究竟是 Watermark 还是其他?

为解决这个困惑,转变使用 Kafka 和 Socket 等无界流进行验证,最后得出结论:Timer 也是由 Watermark 完成触发的。 因此,学生觉得本节内容用无界流来展示效果可能会好些。

写回答

1回答

Michael_PK

2021-09-09

流是无解的,但是流中一般是结合window+wm切开再进行处理的,而且很多功能都是使用eventtime时间来处理。

无界流时来一个就处理一个,这和window wm等是没有必然联系的。


0
1
MagicPenta
才想起来这个问题已经解决了,特此来跟老师交个作业。 KeyedProcessFunction 的 onTimer 方法是由 KeyedProcessOperator 的 onEventTime 方法触发,确实如老师所说根据 eventTime 来处理。 不过更深层次,是由 InternalTimerService 根据以下条件来判断的: while ((timer = eventTimeTimersQueue.peek()) != null && timer.getTimestamp() <= time) 这个条件包含两个: 1. 我们有注册定时器,即 registerEventTimeTimer 2. 定时器里的时间是小于 watermark 的 所以学生问题里才会有 Timer 由 watermark 触发的表述。 当然,这个表述也不严谨。实际上,我们生成 watermark 时,它会跟普通数据一样加入到流中,StreamTask 判断这条数据的类型是 watermark 的话,会调用 StreamOperator 的 processWatermark 方法,而这个方法会触发我们上面提到的定时器 InternalTimerService 服务,进而最终触发 onTimer。 那么,为何文本流中,无论我在 registerEventTimeTimer 中设置时间戳为何值 onTimer(...) 方法都会被触发呢? 这是因为,在文本流关闭时,ContinuousFileReaderOperator 的 close 方法会做这么个事情: sourceContext.emitWatermark(Watermark.MAX_WATERMARK) 这就导致无论我的注册时间是什么,最终都会有一个值为 Long.MAX_VALUE 的 watermark 注入到流中,触发 onTimer 执行。
2021-12-31
共1条回复

Flink+ClickHouse 玩转企业级实时大数据开发

已经在做大数据,Flink助力轻松提薪;尚未入行,让你弯道超车

1024 学习 · 225 问题

查看课程