Flink学习笔记:Time的故事

说明:本文为《Flink大数据项目实战》学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,                                                                        推荐学习课程:Flink大数据项目实战:http://t.cn/EJtKcD1

Time三兄弟

1.1 DataStream支持的三种time

DataStream有大量基于time的operator,windows操作只是其中一种。

Flink支持三种time:

1.EventTime

2.IngestTime

3.ProcessingTime

1.2三个时间的比较

EventTime

1.事件生成时的时间,在进入Flink之前就已经存在,可以从event的字段中抽取。

2.必须指定watermarks(水位线)的生成方式。

3.优势:确定性,乱序、延时、或者数据重放等情况,都能给出正确的结果

4.弱点:处理无序事件时性能和延迟受到影响

IngestTime

1.事件进入flink的时间,即在source里获取的当前系统的时间,后续操作统一使用该时间。

2.不需要指定watermarks的生成方式(自动生成)

3.弱点:不能处理无序事件和延迟数据

ProcessingTime

1.执行操作的机器的当前系统时间(每个算子都不一样)

2.不需要流和机器之间的协调

3.优势:最佳的性能和最低的延迟

4.弱点:不确定性,容易受到各种因素影像(event产生的速度、到达flink的速度、在算子之间传输速度等),压根就不管顺序和延迟

比较

性能:ProcessingTime> IngestTime> EventTime

延迟:ProcessingTime< IngestTime< EventTime

确定性:EventTime> IngestTime> ProcessingTime

1.3根据业务选择最合适的时间

Hadoop的日志进入Flink的时间为2018-12-23

17:43:46,666(Ingest Time),在进入window操作时那台机器的系统时间是2018-12-23 17:43:47,120(Processing Time),日志的具体内容是:

      (Event Time)2018-12-2316:37:15,624 INFOorg.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider - Failing overto rm2

要统计每个5min内的日志error个数,哪个时间是最有意义的? 最佳选择就是【event time】。一般都需要使用event time,除非由于特殊情况只能用另外两种时间来代替。

1.4设置time类型

设置时间特性

final StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);

不设置Time 类型,默认是processingTime。


如果使用EventTime则需要在source之后明确指定Timestamp Assigner & Watermark Generator(见后面小节)。

时间戳和水位线背后的机制

2.1 Watermarks是干啥的

out-of-order/late element

实时系统中,由于各种原因造成的延时,造成某些消息发到flink的时间延时于事件产生的时间。如果基于event time构建window,但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。

Watermarks(水位线)就是来处理这种问题的机制

1.参考google的DataFlow。

2.是event time处理进度的标志。

3.表示比watermark更早(更老)的事件都已经到达(没有比水位线更低的数据 )。

4.基于watermark来进行窗口触发计算的判断。

2.2有序流中Watermarks

在某些情况下,基于Event Time的数据流是有续的(相对event time)。在有序流中,watermark就是一个简单的周期性标记。

2.3乱序流中Watermarks

在更多场景下,基于Event Time的数据流是无续的(相对event time)。

在无序流中,watermark至关重要,她告诉operator比watermark更早(更老/时间戳更小)的事件已经到达, operator可以将内部事件时间提前到watermark的时间戳(可以触发window计算啦)

上图可以类比银行或者医院的排号来理解。

2.4并行流中的Watermarks

通常情况下, watermark在source函数中生成,但是也可以在source后任何阶段,如果指定多次 watermark,后面指定的 watermark会覆盖前面的值。 source的每个sub task独立生成水印。

watermark通过operator时会推进operators处的当前event

time,同时operators会为下游生成一个新的watermark。

多输入operator(union、 keyBy、 partition)的当前event time是其输入流event time的最小值。

生成Timestamp和Watermark

3.1 Timestamp /Watermark两种生成方式

3.2 Timestamp /Watermark两种生成方式

只有基于EventTime的流处理程序需要指定Timestamp和Watermarks的生成方式。

指定时间特性为Event Time(前面讲过)。

final StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

分配timestamp和生成Watermarks两种方式:

声明时间特性为Event Time后,Flink需要知道每个event的timestamp(一般从event的某个字段去抽取),Flink还需要知道目前event time的进度也就是Watermarks(一般伴随着Event Time一起指定生成方式,二者息息相关)

方式1:直接在source function中生成

方式2:timestamp assigner / watermark generator

注意:timestamp和watermark都是采用毫秒(从java的1970-01-01T00:00:00Z时间作为起始)。

声明:event、element、record都是一个意思。

3.3方式一、直接在source function中生成

自定义source实现SourceFunction接口或者继承RichParallelSourceFunction。

3.4方式二、timestamp assigner / watermark generator

通过assignTimestampsAndWatermarks方法指定timestampassigner / watermark generator

一般在datasource后调用assignTimestampsAndWatermarks,也可以在第一个基于event time的operator之前指定(例如window

operator)。

特例:使用Kafka Connector作为source时,在source内部assignTimestampsAndWatermarks。

3.5两种Watermark

Periodic(周期性)Watermarks

1.基于Timer

2.ExecutionConfig.setAutoWatermarkInterval(msec)

(默认是 200ms, 设置watermarker 发送的周期)。

3.实现AssignerWithPeriodicWatermarks接口。

Puncuated(间断的)WaterMarks

1.基于某些事件触发watermark 的生成和发送(由用户代码实现,例如遇到特殊元素) 。

2.实现AssignerWithPeriodicWatermarks接口。

3.6 Periodic Watermark

周期性调用getCurrentWatermark,如果获取的Watermark不等于null且比上一个最新的Watermark大就向下游发射。


3.7 Puncuated Watermark

间断性调用getCurrentWatermark,它会根据一个条件发送watermark,这个条件可以自己去定义。

预定义Timestamp Extractors / Watermark Emitters

4.1Assigners with ascending timestamps

适用于event时间戳单调递增的场景,数据没有太多延时。

4.2允许固定延迟的Assigner

适用于预先知道最大延迟的场景(例如最多比之前的元素延迟3000ms)。

4.3延迟数据处理

延时数据处理一般有两种处理方式:

方式一:allowedLateness(),设定最大延迟时间,触发被延迟,不宜设置太长。

方式二: sideOutputTag ,提供了延迟数据获取的一种方式,这样就不会丢弃数据了。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容