目录
1、Flink使用WaterMark处理乱序事件
2、累加器和计数器
3、Window使用
4、流的切分和合并
5、任务链
6、Flink消费kafka数据起始offset配置
7、Flink消费kafka数据,消费者offset提交配置
8、数据源
9、数据存放
10、运行时环境的区别
11、keyedStream中进行聚合操作
一.Flink使用WaterMark处理乱序事件[1]
watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现。
流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)
但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。
关于水位线机制这篇博客讲的比较通俗易懂,Flink流计算编程--watermark(水位线)简介
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//将TimeCharactersistic设置为EventTime。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val text = env.socketTextStream("localhost", 9999)
// 指定watemark的实现
text.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessGenerator )
自定义的实现AssignerWithPeriodicWatermarks接口的类
class BoundedOutOfOrdernessGenerator extends AssignerWithPeriodicWatermarks[MyEvent] {
//最大允许的乱序时间是10s,告诉Flink希望消息最多有10s的延迟,每个窗口仅在waterMark通过时被处理
val maxOutOfOrderness = 10000L;
var currentMaxTimestamp: Long;
//extractTimestamp方法是从数据本身中提取EventTime
override def extractTimestamp(element: String, previousElementTimestamp: Long): Long = {
val timestamp = element.getCreationTime()
currentMaxTi