Apache flink 在同一密钥上的多个流之间联接

Apache flink 在同一密钥上的多个流之间联接,apache-flink,Apache Flink,弗林克社区 我有一个关于在Flink equi连接中在同一个键上连接多个流的问题。我仍然是一个新手,为我的团队评估Flink,将我们的Spark批处理应用程序迁移到流处理 注意:我看了Fabian Hüske的这篇关于连接处理的文章: 为了简化问题,让我们假设您有3个流,每个流都有唯一的记录,这些记录可以由id字段设置关键字。对于流中的每个记录,您将在其他流中找到相应的记录。您希望在id字段中加入这些流 问题: 当您加入流1和流2时,我知道这两个流的内容将根据加入密钥进行洗牌。当我将结果流与流3

弗林克社区

我有一个关于在Flink equi连接中在同一个键上连接多个流的问题。我仍然是一个新手,为我的团队评估Flink,将我们的Spark批处理应用程序迁移到流处理

注意:我看了Fabian Hüske的这篇关于连接处理的文章:

为了简化问题,让我们假设您有3个流,每个流都有唯一的记录,这些记录可以由id字段设置关键字。对于流中的每个记录,您将在其他流中找到相应的记录。您希望在id字段中加入这些流

问题:

当您加入流1和流2时,我知道这两个流的内容将根据加入密钥进行洗牌。当我将结果流与流3连接时,我假设流3将被洗牌,但之前的结果记录是否会再次洗牌,即从1和2之间的连接开始? 在Spark中,我认为前面的连接结果不会被洗牌,前提是不更改键,并且使用相同的哈希分区器

当与流3连接时,流1和2之间连接的结果是否会被序列化和反序列化

在这个例子中,我们在流1和2之间,以及在结果连接结果和流3之间有2个连接操作符。据我所见,我的每个操作符都有一个状态。假设我使用的是GlobalWindows,并且假设我的联接操作只保留每个字段,那么两个运算符状态之间是否存在重复数据?我天真地认为不应该

我说的有点混乱,但我认为第一个操作符将记住来自流1和流2的数据,然后第二个操作符将记住来自流1、流2和流3的数据。我观察到,我的第一个操作符的状态大小很大我的实验有一年的数据,但是第二个操作符的状态大小要大得多。。。最后的检查点状态大小似乎是1/2连接的状态大小,加上1/2/3连接的状态大小,如果1/2连接数据相同,它不应该只是3的大小吗

谢谢,
Nicolas

目前,在Flink中,流上的每个连接都需要一个完整的洗牌,包括您提到的序列化和反序列化。主要原因是Flink无法将具有2个输入的运算符链接到前一个运算符。目前,允许N个输入操作符,这将完全避免用例中的额外混乱


您的联接操作符各自维护其状态。这意味着您的第二次联接包含所有联接的记录和来自流3的所有记录。如果第一个联接的基数为1,则第二个联接的状态大小大于第一个联接。看似冗余复制的原因是,当使用时间窗口(通常是连接流的唯一可行方式)时,两个操作员可能处于不同的时间,因此第一个操作员在第二个操作员处理条目时已将其从状态中删除。

感谢您的解释!:Dbtw如果您正在处理全局窗口和有界数据集,您可能希望查看flink的批处理部分。执行过程经过了大量优化,可能会优化查询。