窗口与水位线
window的执行也是由Watermark触发的。 Watermark可以理解成一个延迟触发机制,我们可以设置Watermark的延时时长t,每次系统会校验已经到达的数据中最大的maxEventTime,然后认定eventTime小于maxEventTime - t的所有数据都已经到达,如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行
TimeWindow 和 TimeWindowAll 都适用于对流式数据转化做一定时间范围内的批处理,主要区别在两者的并行度,前者为 Parallel Operator 后者为 Non Parallel Operator,所以 TimeWindow 的适用范围更广,适合一些需要对数据分批分 key处理且数据量较大需要并行处理的场景;而 TimeWindowAll 汇聚一段时间内的所有数据,适合需要汇总所有数据或者数据量不大的任务,这样可以减少并发,例如任务内需要涉及到数据网络 IO,如果并行度过高则容易导致网络服务过载。
B.转换
TimeWindow 的并行度变成 1 则变为 TimeWindowAll;如果 TimeWindowAll 的数据实在很大,可以先通过一层 TimeWindow 做分区的汇总,随后将数据回收至 TimeWindowAll 做总的汇总,有点类似 Spark 的 groupByKey 和 reduceByKey。
Exactly Once
source可重设读取位置:例如kafka可支持消息回放。
幂等写入:可能出现ABA问题,在云搜的gaia里面进行增量回溯时就有这个问题。
事务写入:checkpoint+ 预写日志(wal,不完全可靠,可能在sink时失败),而两阶段提交(2pc)更加可靠,但要求外部sink系统支持事务,例如kafka也可以支持预提交,uncommitted数据是不允许被消费的。不过kafka默认隔离级别是read_uncommitted,需要配置成read_committed(不过隔离级别提高,会增加消费延迟)。
以kafka-flink-kafka的常见流式处理为例,实现exactly-once操作如下:
网友评论