为什么 Apache Flink 需要 Watermarks 进行事件时间处理?

2023-11-23

有人可以正确解释事件时间戳和水印吗?我从文档中理解了它,但不是那么清楚。现实生活中的例子或外行定义会有所帮助。另外,如果可能的话请给出一个示例(以及一些可以解释它的代码片段)。提前致谢


这是一个示例,说明了为什么我们需要水印以及它们的工作原理。

在此示例中,我们有一个带时间戳的事件流,这些事件的到达顺序有些混乱,如下所示。显示的数字是事件时间时间戳,指示这些事件实际发生的时间。第一个到达的事件发生在时间 4,随后是更早发生的事件(时间 2),依此类推:

··· 23 19 22 24 21 14 17 13 12 15 9 11 7 2 4 →

现在想象一下我们正在尝试创建一个流排序器。这意味着一个应用程序在流到达时处理每个事件,并发出一个包含相同事件的新流,但按时间戳排序。

一些观察结果:

(1) 我们的流排序器看到的第一个元素是 4,但我们不能立即将其作为排序流的第一个元素释放。它可能已无序到达,并且更早的事件可能尚未到达。事实上,我们对这个流的未来有一些神一样的了解,我们可以看到我们的流排序器应该至少等到 2 到达才能产生任何结果。

结论:一些缓冲和一些延迟是必要的。

(2) 如果我们做错了,我们可能会永远等待。首先,我们的应用程序看到了时间 4 的事件,然后看到了时间 2 的事件。时间戳小于 2 的事件会到达吗?或许。也许不会。我们可以永远等待,也永远看不到 1。

结论:最终我们必须勇敢地发出 2 作为排序流的开始。

(3) 我们需要某种策略,定义对于任何给定的带时间戳的事件,何时停止等待较早事件的到达。

这正是水印的作用- 它们定义何时停止等待较早的事件。

Flink 中的事件时间处理取决于水印生成器将特殊的带时间戳的元素插入流中,称为水印.

我们的流排序器什么时候应该停止等待,并推出 2 来启动排序流?当水印到达时时间戳为 2 或更大。

(4) 我们可以想象不同的策略来决定如何生成水印。

我们知道每个事件都会在一定的延迟后到达,并且这些延迟各不相同,因此某些事件比其他事件延迟得更多。一种简单的方法是假设这些延迟受到某个最大延迟的限制。 Flink 将此策略称为有界无序性水印。很容易想象更复杂的水印方法,但对于许多应用程序来说,固定延迟就足够了。

如果你想构建一个像流排序器这样的应用程序,Flink 的KeyedProcessFunction是正确的构建块。它提供对事件时间计时器(即根据水印到达而触发的回调)的访问,并具有用于管理缓冲事件所需状态的挂钩,直到轮到它们发送到下游为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Apache Flink 需要 Watermarks 进行事件时间处理? 的相关文章

随机推荐

  • Swift 2.0 肥皂请求与 Alamofire 发送 xml 参数

    我想向此 Web 服务示例发出请求 http www holidaywebservice com HolidayService v2 HolidayService2 asmx wsdl 我需要发送一个参数 countryCode 我不知道如
  • 使用 spring 控制器和不同的类在 jsp 中渲染数据

    我想渲染数据 this is how my jsp page table look like 我如何实现这一目标 请帮我 这给我带来了很多困惑 要定义多少个类以及哪些字段 thanks 您的数据很可能来自数据库 这是一种List返回了 ja
  • VSCode Marketplace 扩展:ZIP 损坏:未找到中央目录记录签名末尾

    我正在尝试安装从 Marketplace 下载的 VSIX 包wget在安装了 VSCode 服务器的 Linux VM 上 但出现以下错误 wget nv https marketplace visualstudio com apis p
  • Re.sub 不适合我

    我想得到re sub例如替换用值指定的模式 for lines in f pattern 2 key 0 2 re search pattern lines 这将返回找到模式的行 例如 这是测试返回之一 这是一个 测试 我遇到的问题是当我执
  • 使用 PHP 检查远程文件是否为格式良好的 XML

    我有一个 PHP 驱动的网站 其中包含 XML 库存提要 该提要由 ASP 远程提供 即 XML 提要 url 的顺序为 http remote com client asp 由于提要经常不可用 我的意思是网站返回 ASP 错误 我想在包含
  • memcpy 与 C 中的赋值——应该是 memmove?

    正如指出的这个问题的答案 编译器 在本例中是 gcc 4 1 2 是的 它很旧 不 我无法更改它 可以在它认为合适的地方用 memcpy 替换结构体赋值 我正在 valgrind 下运行一些代码 并收到有关 memcpy 源 目标重叠的警告
  • 在Java中,为什么超类方法不能从子类实例访问受保护或私有方法/变量?

    让我们从另一种行为开始 即使您将方法 变量声明为私有 同一类的另一个实例也可以访问它 没关系 我可以忍受 我将这些称为类私有而不是实例私有 现在问题部分 例如 在运行时我希望能够检查所有字符串变量thisclass 不为 null 如果为
  • junit 3 中的类拆解?

    我们有很多使用 JUnit 编写的集成测试3 尽管我们现在运行它们4 4 其中一些需要在类中的所有测试完成后运行的tearDown 方法 以释放一些公共资源 我发现这可以在 junit 4 中使用 AfterClass org junit
  • 在 SQL 中将列转换为行[重复]

    这个问题在这里已经有答案了 我需要编写一个查询 该查询获取行并将其转换为列 这是我的表 Count fname lname id 1 abc def 20 2 pqr 20 3 abc xyz 20 4 xyz xyz 20 1 abc d
  • git 的耐心差异算法的实现是否正确?

    Stackoverflow 上的这个问题似乎是应用耐心差异算法的良好候选者 然而 在测试我的潜在答案时 我发现git diff patience没有达到我的预期 并且在这种情况下 与默认的 diff 算法没有什么不同 cat a Funct
  • Android 中如何检查数据库是否存在?

    我正在使用 Room API 在我的 Android 应用程序中实现数据库 似乎每次我加载应用程序时 它都会尝试一次又一次地创建数据库 有什么办法可以限制这个吗 db Room databaseBuilder context AppData
  • 在Android中启用MultiDex支持以在Eclipse中实现65K+方法

    我正在尝试在 eclipse 中构建 Multidex apk 但未能成功 我尝试了以下步骤 在 Android 应用程序中配置 Multidex 支持 我已将位于 extras android support multidex 的 Mul
  • 带有滚动视图的 Android 操作栏选项卡在方向更改后复制了视图

    我有一个非常简单的代码 我将操作栏与选项卡片段一起使用 加载后它工作正常 但方向改变后它会变得疯狂 旧片段也可见 为什么 Sorry for Hungarian texts on the image but I hope it doesn
  • 当浏览器以角度关闭时清除本地存储

    我创建了一个 Angular 5 应用程序 它使用基于令牌的系统 当前我将令牌存储在本地存储中 我希望本地存储在浏览器关闭时保持清晰 并且在浏览器刷新时不清除本地存储 我没有使用sessionstorage的原因是因为在新选项卡或窗口中打开
  • 将第一行与数据框中的列标题合并

    我正在尝试清理 Excel 文件以进行进一步的研究 我遇到的问题是 我想合并第一行和第二行 我现在拥有的代码 xl pd ExcelFile nanonose xls df xl parse Sheet1 df df drop Unname
  • 浏览器滚动条移位

    当您转到我的网站上有额外内容的页面时 滚动条出现在右侧 但我的内容有明显的向左移动 您可以通过单击主页 托管并再次返回我的网站 www ipalaces org 来注意到这一点 如何解释页面上的浏览器滚动条 我可以让滚动条至少始终可见吗 我
  • 调试 ASP.NET Core 时看不到值

    使用 Visual Studio 2015 调试 ASP NET Core 应用程序时 我无法看到变量 参数和字段值 例如 将鼠标悬停在这些值上 我也无法将它们添加到手表中 我正在调试中运行 我们可能已经找到了问题的解决方案 或至少是解决方
  • 如何将对象转换为其实际类型?

    如果我有 void MyMethod Object obj 我怎样才能投obj它的实际类型是什么 如果您知道实际类型 那么只需 SomeType typed SomeType obj typed MyFunction 如果您不知道实际类型
  • 使用 tkinter 制作简单动画

    我有一个简单的代码来使用 tkinter 可视化一些数据 按钮单击绑定到重绘下一个数据 帧 的函数 但是 我希望能够选择以一定的频率自动重绘 我对 GUI 编程非常陌生 我不需要为这段代码做很多事情 所以我的大部分 tkinter 知识都来
  • 为什么 Apache Flink 需要 Watermarks 进行事件时间处理?

    有人可以正确解释事件时间戳和水印吗 我从文档中理解了它 但不是那么清楚 现实生活中的例子或外行定义会有所帮助 另外 如果可能的话请给出一个示例 以及一些可以解释它的代码片段 提前致谢 这是一个示例 说明了为什么我们需要水印以及它们的工作原理