0

我有一个基于 Flink Data Stream 的工作 Flink 作业。我想基于 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,但我不知道如何

4

1 回答 1

1

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

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

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

使用 Statefun API 执行此操作

您可以使用上述相同的模式。函数 id 将扮演与 key 相同的角色,您可以使用延迟消息而不是计时器:

  • 当每个切片到达时,将其添加到正在组装的数据包中
  • 如果它是第一个切片,则发送一条延迟消息,该消息将充当超时
  • 当所有切片都到达时,合并它们并发送数据包
  • 如果延迟消息在数据包完成之前到达,则做任何适当的事情(例如,继续发送部分数据包)
于 2022-01-10T19:11:34.300 回答