需要有关从 Flink DataStream Job 迁移到 Flink Stateful Functions 3.1 的建议

Need advice on migrating from Flink DataStream Job to Flink Stateful Functions 3.1

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

我目前的Flink Job的功能是:

  1. 读取来自 Kafka 的消息
  2. 每条消息的格式都是数据包的一部分,例如(s代表切片):
    • s-0, s-1 用于数据包 0
    • s-4、s-5、s-6 用于数据包 1
  3. job将slice合并成多个数据包,然后sink packets到HBase
  4. Window函数用于处理切片到达的乱序

我的目标

我目前的计划

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

我的问题

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

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

更新:

windows 习惯于 assemble 结果

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

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

背景:使用 KeyedProcessFunctions 而不是 Windows 到 Assemble 相关事件

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

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

用 Statefun 做这个 API

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

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