我有一个基于 Flink Data Stream 的工作 Flink 作业。我想基于 Flink 有状态函数 3.1重写整个作业。
我目前的 Flink Job 的功能是:
- 阅读来自 Kafka 的消息
- 每个消息的格式都是一个数据包的切片,例如(s for slice):
- s-0, s-1 用于数据包 0
- s-4、s-5、s-6 用于数据包 1
- 该作业将切片合并为几个数据包,然后将数据包接收到 HBase
- 窗口函数用于处理切片到达的无序
我的目标
- 目前我已经在我的 k8s 上运行了 Flink Stateful Functions 演示。我想在有状态函数上重写我的整个工作。
- 将数据保存到 MinIO 而不是 HBase
我目前的计划
我已经阅读了文档并得到了一些想法。我的计划是:
- 不再需要处理 Kafka,
Kafka Ingress
(https://nightlies.apache.org/flink/flink-statefun-docs-release-3.0/docs/io-module/apache-kafka/)处理它 - 基于 java SDK 重写我的工作。合并很简单。但是窗口函数呢?
- 也许我应该使用带有 TTL 的持久状态来模拟窗口函数行为
- Egress for
MinIO
不在 default 列表中Flink I/O Connectors
,因此我需要根据https://nightlies.apache.org/flink/flink-statefun-docs-release-3.0/docs/io-module/Flink I/O Connector
为自己编写自定义flink 连接器/MinIO
- 我想避免
Embedded module
,因为它可以防止缩放。自动缩放是我要迁移到的关键原因Flink stateful functions
我的问题
我对我的计划没有信心。我的理解/计划有什么问题吗?
有什么我应该参考的最佳实践吗?
更新:
窗口用于组装结果
- 获取一个切片,检查它的元数据并知道它是数据包的最后一个
- 也知道数据包应该包含 10 个切片
- 如果已经有 10 个切片,则合并它们
- 如果还没有足够的切片,请等待一段时间(例如 10 分钟),然后合并或记录数据包错误。
我想在重写期间摆脱 windows,但我不知道如何