Flink的watermarks
1. watermark的概念
watermark是一种衡量Event Time进展的机制,它是数据本身的一个隐藏属性。通常基于Event Time的数据,自身都包含一个timestamp,例如1472693399700(2016-09-01 09:29:59.700),而这条数据的watermark时间则可能是:
watermark(1472693399700) = 1472693396700(2016-09-01 09:29:56.700)
这条数据的watermark时间是什么含义呢?即:timestamp小于1472693396700(2016-09-01 09:29:56.700)的数据,都已经到达了。

图中蓝色虚线和实线代表着watermark的时间。
2. watermark的作用
watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现。
我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。
但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。
实现Watermark的相关代码
程序说明
首先通过socket模拟接收数据,然后使用map函数进行处理,接着调用assignTimestampsAndWatermarks方法抽取timestamp并且生成watermark,最后调用Window打印信息来验证Window被触发的时机。
代码实现
package org.tryael.flink.experiment;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.watermark.Watermark;
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
import javax.annotation.Nullable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* 程序说明:首先使用Socket模拟接收数据,然后使用map进行处理,
* 接着调用assignTimestampsAndWatermarks方法抽取timestamp并生成Watermark,
* 最后调用Windows打印信息来验证Window的触发时机
*/
public class

本文介绍了Flink的watermark概念,它作为衡量Event Time进展的机制,用于处理大数据流处理中的乱序事件。watermark结合window机制确保在特定时间后触发窗口计算。文章还展示了如何实现watermark的代码,包括数据接收、timestamp抽取、最大乱序时间设置以及window聚合操作。
最低0.47元/天 解锁文章
2107

被折叠的 条评论
为什么被折叠?



