【问题标题】:Need advice on migrating from Flink DataStream Job to Flink Stateful Functions 3.1需要关于从 Flink DataStream Job 迁移到 Flink Stateful Functions 3.1 的建议
【发布时间】:2022-01-11 03:11:34
【问题描述】:

我有一个基于 Flink Data Stream 的工作 Flink 作业。我想REWRITE基于 Flink 有状态函数 3.1 的整个作业。

我目前的 Flink Job 的功能是:

  1. 从 Kafka 读取消息
  2. 每条消息的格式都是一个数据包的切片,例如(s for slice):
    • s-0, s-1 用于数据包 0
    • s-4、s-5、s-6 用于数据包 1
  3. 该作业将切片合并为多个数据包,然后将数据包接收到 HBase
  4. 窗口函数用于处理切片到达的无序

我的目标

  • 目前我已经在我的 k8s 上运行了 Flink Stateful Functions 演示。我想在有状态函数上重写我的整个工作。
  • 将数据保存到 MinIO 而不是 HBase

我目前的计划

我已经阅读了文档并得到了一些想法。我的计划是:

我的问题

我对自己的计划没有信心。我的理解/计划有什么问题吗?

有什么我应该参考的最佳实践吗?

更新:

窗口被用来组装结果

  1. 获取一个切片,检查它的元数据并知道它是数据包的最后一个
  2. 也知道数据包应该包含 10 个切片
  3. 如果已经有 10 个切片,则合并它们
  4. 如果还没有足够的切片,请等待一段时间(例如 10 分钟),然后合并或记录数据包错误。

我想在重写过程中摆脱 windows,但我不知道如何

【问题讨论】:

  • 你真的需要windows吗?即,您是使用 windows 来计算窗口分析,还是在等待组装完整结果时缓冲数据?
  • 等待组合完整的结果。组装逻辑可以描述为:

标签: apache-flink flink-streaming flink-statefun


【解决方案1】:

背景:使用 KeyedProcessFunctions 而不是 Windows 来组装相关事件

使用 DataStream API,窗口不是将相关事件组合在一起的良好构建块。问题是窗口的开始和结束时间与时钟对齐,而不是与事件对齐。因此,即使两个相关事件仅相隔几毫秒,它们也可能被分配到不同的窗口。

一般来说,使用键控流程函数实现这种用例会更直接,并根据需要使用计时器来处理丢失或延迟的事件。

使用 Statefun API 执行此操作

您可以使用上述相同的模式。 function id 将起到与 key 相同的作用,你可以使用延迟消息而不是计时器:

  • 当每个切片到达时,将其添加到正在组装的数据包中
  • 如果是第一个切片,则发送一条延迟消息,该消息将充当超时
  • 当所有切片都到达时,合并它们并发送数据包
  • 如果延迟消息在数据包完成之前到达,请执行任何适当的操作(例如,继续发送部分数据包)

【讨论】:

  • 感谢您的宝贵指导。早在 2021 年 8 月,我在 Flink 集群中遇到了一个关键而复杂的问题,您在 stackoverflow 上的回答解决了我的问题。我们的 Flink 集群之后就稳定了。在这里,我将公司的平台迁移到云原生。您再次解决了我的问题,宝贵的是一个答案。因此,再次感谢您的回答
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
相关资源
最近更新 更多