需要有关从 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的功能是:
- 读取来自 Kafka 的消息
- 每条消息的格式都是数据包的一部分,例如(s代表切片):
- s-0, s-1 用于数据包 0
- s-4、s-5、s-6 用于数据包 1
- job将slice合并成多个数据包,然后sink packets到HBase
- Window函数用于处理切片到达的乱序
我的目标
- 目前我的 k8s 上已经有了 Flink Stateful Functions demo 运行。我想在有状态函数上重写我的整个工作。
- 将数据保存到 MinIO 而不是 HBase
我目前的计划
我已经阅读了文档并有了一些想法。我的计划是:
- 不用再和Kafka打交道了,
Kafka Ingress
(https://nightlies.apache.org/flink/flink-statefun-docs-release-3.0/docs/io-module/apache-kafka/)搞定
- 基于java SDK重写我的工作。合并很简单。但是 window 函数呢?
- 也许我应该使用带有 TTL 的持久状态来模仿 window 功能行为
MinIO
的出口不在默认列表 Flink I/O Connectors
中,因此我需要根据 [=18] 为 MinIO
自己编写自定义 Flink I/O Connector
=]
- 我想避免
Embedded module
因为它会阻止缩放。自动缩放是我想迁移到 Flink stateful functions
的关键原因
我的问题
我对自己的计划没有信心。我的understandings/plan有什么问题吗?
有什么我应该参考的最佳实践吗?
更新:
windows 习惯于 assemble 结果
- 获取一个切片,检查其元数据并知道它是数据包的最后一个
- 也知道数据包应该包含 10 个切片
- 如果已经有10个切片,合并它们
- 如果还没有足够的切片,等待一段时间(例如10分钟),然后合并或记录数据包错误。
我想在重写过程中去掉windows,但我不知道如何
背景:使用 KeyedProcessFunctions 而不是 Windows 到 Assemble 相关事件
对于 DataStream API,windows 不是将相关事件组合在一起的良好构建块。问题是 windows 在与时钟对齐的时间开始和结束,而不是与事件对齐。因此,即使两个相关事件仅相隔几毫秒,它们也可能被分配给不同的 windows.
一般来说,使用键控流程函数来实现此类用例并根据需要使用计时器来处理丢失或延迟的事件更为直接。
用 Statefun 做这个 API
您可以使用上述相同的模式。 function id 将起到与 key 相同的作用,您可以使用延迟消息而不是计时器:
- 每个切片到达时,将其添加到正在组装的数据包中
- 如果是第一个切片,发送一个延迟消息作为超时
- 当所有分片都到达后,将它们合并并发送数据包
- 如果延迟消息在数据包完成之前到达,请执行任何适当的操作(例如,继续发送部分数据包)
我有一个基于 Flink Data Stream 的 Flink 作业。我想 REWRITE 整个作业基于 Flink 有状态函数 3.1.
我目前的Flink Job的功能是:
- 读取来自 Kafka 的消息
- 每条消息的格式都是数据包的一部分,例如(s代表切片):
- s-0, s-1 用于数据包 0
- s-4、s-5、s-6 用于数据包 1
- job将slice合并成多个数据包,然后sink packets到HBase
- Window函数用于处理切片到达的乱序
我的目标
- 目前我的 k8s 上已经有了 Flink Stateful Functions demo 运行。我想在有状态函数上重写我的整个工作。
- 将数据保存到 MinIO 而不是 HBase
我目前的计划
我已经阅读了文档并有了一些想法。我的计划是:
- 不用再和Kafka打交道了,
Kafka Ingress
(https://nightlies.apache.org/flink/flink-statefun-docs-release-3.0/docs/io-module/apache-kafka/)搞定 - 基于java SDK重写我的工作。合并很简单。但是 window 函数呢?
- 也许我应该使用带有 TTL 的持久状态来模仿 window 功能行为
MinIO
的出口不在默认列表Flink I/O Connectors
中,因此我需要根据 [=18] 为MinIO
自己编写自定义Flink I/O Connector
=]- 我想避免
Embedded module
因为它会阻止缩放。自动缩放是我想迁移到Flink stateful functions
的关键原因
我的问题
我对自己的计划没有信心。我的understandings/plan有什么问题吗?
有什么我应该参考的最佳实践吗?
更新:
windows 习惯于 assemble 结果
- 获取一个切片,检查其元数据并知道它是数据包的最后一个
- 也知道数据包应该包含 10 个切片
- 如果已经有10个切片,合并它们
- 如果还没有足够的切片,等待一段时间(例如10分钟),然后合并或记录数据包错误。
我想在重写过程中去掉windows,但我不知道如何
背景:使用 KeyedProcessFunctions 而不是 Windows 到 Assemble 相关事件
对于 DataStream API,windows 不是将相关事件组合在一起的良好构建块。问题是 windows 在与时钟对齐的时间开始和结束,而不是与事件对齐。因此,即使两个相关事件仅相隔几毫秒,它们也可能被分配给不同的 windows.
一般来说,使用键控流程函数来实现此类用例并根据需要使用计时器来处理丢失或延迟的事件更为直接。
用 Statefun 做这个 API
您可以使用上述相同的模式。 function id 将起到与 key 相同的作用,您可以使用延迟消息而不是计时器:
- 每个切片到达时,将其添加到正在组装的数据包中
- 如果是第一个切片,发送一个延迟消息作为超时
- 当所有分片都到达后,将它们合并并发送数据包
- 如果延迟消息在数据包完成之前到达,请执行任何适当的操作(例如,继续发送部分数据包)