使用 Flink 长时间流连接 Windows
Stream Joins for Large Time Windows with Flink
我需要根据一个键连接两个事件源。事件之间的间隔最长可达 1 年(即具有 id1 的事件 1 可能今天到达,而来自第二个事件源的具有 id1 的对应事件 2 可能在一年后到达)。假设我只想流出连接的事件输出。
我正在探索将 Flink 与 RocksDB 后端一起使用的选项(我遇到了 Table 似乎适合我的用例的 API)。我无法找到执行这种长 window 连接的参考架构。我希望系统每天处理大约 200M 个事件。
问题:
对于这种长 Window 连接,是否有明显的 limitations/pitfalls 使用 Flink?
关于处理这种长 window 连接的任何建议
相关:我也在探索使用 Lambda 和 DynamoDB 作为执行流连接的状态 (Related Question)。如果此信息相关,我将使用托管 AWS 服务。
此用例的明显挑战是一年的大连接 window 大小和可能导致 巨大 状态大小的高摄取率。
这里的主要问题是这是否是一个 1:1 连接,即来自流 A 的记录是否与来自流 B 的记录恰好(或最多)连接一次。这很重要,因为如果您有一个 1:1 连接,您可以在记录与另一条记录连接后立即从该州删除该记录,并且您不需要将其保留一整年。因此,您的状态仅存储尚未加入的记录。假设大多数记录被快速加入,您的状态可能会保持合理的小。
如果你有一个1:1连接,Flink的TableAPI(和SQL)的time-window连接和SQL的Interval连接DataStream API 不是您想要的。它们被实现为 m:n 连接,因为每条记录可能与另一个输入的多个记录连接。因此,他们在整个 window 间隔内保留 all 记录,即在您的用例中保留一年。如果您有 1:1 连接,您应该自己将连接实现为 KeyedCoProcessFunction
。
如果每条记录都可以在一年内加入多次,则没有办法缓冲这些记录。在这种情况下,您可以使用 Flink 的 Table API(和 SQL)的 time-window join 和 DataStream 的 API 的 Interval join。
我需要根据一个键连接两个事件源。事件之间的间隔最长可达 1 年(即具有 id1 的事件 1 可能今天到达,而来自第二个事件源的具有 id1 的对应事件 2 可能在一年后到达)。假设我只想流出连接的事件输出。
我正在探索将 Flink 与 RocksDB 后端一起使用的选项(我遇到了 Table 似乎适合我的用例的 API)。我无法找到执行这种长 window 连接的参考架构。我希望系统每天处理大约 200M 个事件。
问题:
对于这种长 Window 连接,是否有明显的 limitations/pitfalls 使用 Flink?
关于处理这种长 window 连接的任何建议
相关:我也在探索使用 Lambda 和 DynamoDB 作为执行流连接的状态 (Related Question)。如果此信息相关,我将使用托管 AWS 服务。
此用例的明显挑战是一年的大连接 window 大小和可能导致 巨大 状态大小的高摄取率。
这里的主要问题是这是否是一个 1:1 连接,即来自流 A 的记录是否与来自流 B 的记录恰好(或最多)连接一次。这很重要,因为如果您有一个 1:1 连接,您可以在记录与另一条记录连接后立即从该州删除该记录,并且您不需要将其保留一整年。因此,您的状态仅存储尚未加入的记录。假设大多数记录被快速加入,您的状态可能会保持合理的小。
如果你有一个1:1连接,Flink的TableAPI(和SQL)的time-window连接和SQL的Interval连接DataStream API 不是您想要的。它们被实现为 m:n 连接,因为每条记录可能与另一个输入的多个记录连接。因此,他们在整个 window 间隔内保留 all 记录,即在您的用例中保留一年。如果您有 1:1 连接,您应该自己将连接实现为 KeyedCoProcessFunction
。
如果每条记录都可以在一年内加入多次,则没有办法缓冲这些记录。在这种情况下,您可以使用 Flink 的 Table API(和 SQL)的 time-window join 和 DataStream 的 API 的 Interval join。