Flink Watermarks【水位线】详解
问题导读
1.Watermarks是什么?
2.Watermarks是为了解决什么问题?
3.如何生成watermarks?
最新经典文章,欢迎关注公众号
http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg
Flink Watermarks不容易理解,而且和windows混合,就容易造成混乱了,Watermarks直接翻译为水印。翻译为“水位线”更合适些。本文需要Flink Watermarks基础。首先白话Watermarks的作用,首先我们都知道流式数据,但是流并不是那么顺畅的,比如网络卡等原因,造成数据流乱序,这时候该如何解决,于是产生了Watermarks,更多参考下面文字。
Flink使用Watermarks的四个认识
在下面的示例中,我们有一个带时间戳的事件流,这些事件在某种程度上不按顺序到达。 显示的数字是指示实际发生这些事件的时间戳。 到达的第一个事件发生在时间4,然后是之前发生的事件,时间2,依此类推:
注意,这是事件时间( Event-time)处理的示例,这意味着时间戳反映事件发生的时间,而不是事件被处理的时间。事件时处理是一个抽象,它使得创建流式应用程序成为可能,无论它们是在处理实时数据还是在重新处理历史数据,这些应用程序的行为都是一致的。
可以在FLink文档中找到更多关于时间的不同概念,例如事件时间(event time)、处理时间或摄取(ingestion )时间。
现在假设我们正在尝试创建一个流分类器。这意味着应用程序在流到达时处理每个事件,并emit包含相同事件但按其时间戳排序的新流。
认识#1:
我们的流分类器看到的第一个元素是4,但我们不能立即将它作为排序流的第一个元素释放。 它可能已经故障,而早期的事件可能还会到来。 实际上,我们可以从这个流的未来中获得一些内容,我们可以看到我们的流分类器应该至少等到2到达之后再产生任何结果。
有些缓冲,有些延迟是必要的。
认识#2:
如果我们出错了(故障),我们可能会永远等待。 首先,我们的应用程序从第4个时间开始看到一个事件,然后从第2个时间开始看到一个事件。从早于2的时间开始的事件是否会到达? 也许。 也许不吧。 我们可以永远等待,永远不会看到1。
最终,我们必须做决定,并将2作为排序流的开始。
认识#3:
我们需要的是某种策略,它定义了对于任何给定的时间戳事件何时停止等待早期事件的到来。
这正是Watermarks的作用 - 它们定义何时停止等待早期事件。
Flink中的事件时间处理取决于特殊的带时间戳的元素,称为watermarks,由数据源或watermarks生成器插入到流中。 具有时间戳t的watermarks可以被理解为断言(assertion )所有具有时间戳<t的事件已经(具有合理的概率)已经到达。
什么时候我们的流分类器应该停止等待,然后推出2来启动已排序的流? 当watermarks到达时间戳为2或更大时。
认识#4:
我们可以设想不同的策略来决定如何生成watermarks。
我们知道每个事件都会在延迟一段时间后到达并且这些延迟会有所不同,因此有些事件会比其他事件延迟更多。 一种简单的方法是假设这些延迟受到一些最大延迟的限制。 Flink将此策略称为有界无序watermarks。 很容易想象出更复杂的watermarks方法,但对于许多应用来说,固定延迟效果还不错。
如果要构建像流分类器这样的应用程序,Flink的ProcessFunction是正确的构建块。 它提供对事件时间(event-time )计时器的访问(即,基于watermarks到达而触发的回调),并具有用于管理缓冲事件所需状态的挂钩,直到轮到它们被发送到下游。
没看懂要讲什么
页:
[1]