如何实现直接在数据源上使用Watermark?
当使用 Apache Kafka 连接器作为数据源时,每个 Kafka 分区可能有一个简单的事件时间模式(递增的时间戳或有界无序)。然而,当使用 Kafka 数据源时,多个分区常常并行使用,因此交错来自各个分区的事件数据就会破坏每个分区的事件时间模式(这是 Kafka 消费客户端所固有的)。
在这种情况下,你可以使用 Flink 中可识别 Kafka 分区的 watermark 生成机制。使用此特性,将在 Kafka 消费端内部针对每个 Kafka 分区生成 watermark,并且不同分区 watermark 的合并方式与在数据流 shuffle 时的合并方式相同。
例如,如果每个 Kafka 分区中的事件时间戳严格递增,则使用时间戳单调递增按分区生成的 watermark 将生成完美的全局 watermark。
注意,我们在示例中未使用 TimestampAssigner,而是使用了 Kafka 记录自身的时间戳。
下图展示了如何使用单 kafka 分区 watermark 生成机制,以及在这种情况下 watermark 如何通过 dataflow 传播。
在实际的计算中,往往会出现一个作业中会处理多个source的数据, 对source的数据进行groupBy分组,那么来自不同source的相同的key会shuffle到同一个处理节点. 并且携带各自的Watermark。
Flink内部要保证Watermark的单调递增,多个source的Watermark汇聚到一起是不可能单调递增的。
Flink内部实现每一个边上只能有一个递增的Watermark, 当出现多个流携带EventTime汇聚到一起(groupBy或者Union)。Flink会选择所有输入流中EventTime中最小的一个向下游流出。从而保证Watermark的单调递增和数据的完整性。

需求
读取kafkaconsumer并设置水印机制
操作步骤
1. 获取流执行环境,设置并行度1
2. 创建FlinkKafkaConsumer和相应的配置
3. 设置consumer的水印机制为20
4. 通过consumer添加数据源
5. 根据滚动处理时间窗口5s做wordcount,先flatMap,keyBy,window,sum
6. 打印输出
7. 执行流环境
参考代码
