当前位置: 首页 > 知识库问答 >
问题:

在同一键上的多个流之间连接

朱乐逸
2023-03-14

Flink社区!

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

注意:我看了FabianHüske的这篇关于加入处理的文章:窥视Apache Flink的引擎室。

为了简化问题,假设您有3个流,每个流都有唯一的记录,可以通过id字段进行键控。对于流中的每条记录,您将在其他流中找到相应的记录。您想在id字段上加入这些流。

问题:

  • 当您加入流#1和流#2时,我知道这两个流的内容将根据加入键进行洗牌。当我将结果流与流#3联接时,我假设流#3将被洗牌,但之前的结果记录是否会再次洗牌(即从#1和#2之间的联接)

(在Spark中,我认为之前的连接结果不会被洗牌,前提是不更改键,并且使用相同的哈希分区器)。

>

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

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

谢谢,尼古拉斯

共有1个答案

鲁博瀚
2023-03-14

目前,在Flink中,流上的每个连接都需要一个完整的洗牌,包括您提到的序列化和反序列化。主要原因是Flink无法将一个操作符与前一个操作符的2个输入链接起来。目前正在进行允许N个输入操作符的工作,这将完全避免用例中的额外无序处理。

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

 类似资料:
  • HTML CSS 我尝试在img部分使用和,但当我刷新html页面时,它仍然在图像和绿框之间包含空白。请问有没有一种方法可以使绿框与图像粘在一起,没有任何空白的行,包括最左和最右?

  • 我尝试使用批注将连接到 从数据库生成类。 例外情况是: null 有人有类似的问题吗?有什么解决办法吗?这可能是虫子吗?!

  • 我试图用s和每两个之间的连接线来进行类似网络的设计,但是当我用下面的JS函数使用和标记时,控制台显示了一个错误

  • 我有3个< code > edittext(et1,et2,et3),彼此相邻排列,其中< code>maxLength为“1”。 我的要求是: > < li> 当在编辑文本中键入字母时(只能包含1个字符,因为最大长度为1),光标会自动转到下一个编辑文本。 类似地,当用户单击et2上的back时,光标应该转到et1。 编辑文本将按顺序填写。首先是第一个,然后是第二个,最后是第三个。因此,即使用户单

  • 最近我正在用Spring Boot与ApachePOI合作,我面临一个问题。我想表示实体之间的数据库连接,但我在可视化多个连接时遇到了问题<所以我的基本问题是分离连接。 以下是我的出发点:1 你看不见,但这两个矩形之间有多个连接,但由于相同的起点和终端,它们相互揭示。 生成的XML代码如下: 所以我想做的是用不同的值设置曲线的圆心中点,就像在这张图中(我手动做这个例子):2 我尝试向连接器添加其他

  • 问题内容: 我正在开发一个将用作其他应用程序的可扩展框架的应用程序。 基本类之一称为节点,节点具有内容。SQL表如下所示: TABLE节点(NodeId int,....等) 表格NodeContentRelationship(NodeId int,ContentType字符串,ContentId int) 开发人员可以扩展应用程序以创建自己的内容类型。 显然,从关系数据库的角度来看,这很不好,因