Apache Flink中的数据交换查询



浏览一本关于Apache Flink的书,它有以下内容:

如果发送方任务和接收方任务在同一TaskManager进程中运行,则发送方任务将传出的记录序列化到字节缓冲区中,并将缓冲区放入队列中一旦填满。接收任务从队列中获取缓冲区并反序列化传入的记录。因此,不涉及网络通信。

如果发送方和接收方都在同一JVM进程中,为什么我们需要序列化?

有几个原因,但让我们退一步谈谈运营商链。

如果两个连续的运算符具有相同的并行度,只有一个输入/输出,共享一个任务槽,并且还公开某些属性(例如,他们说可以链接(,则可以使用运算符链。最简单的链只是一系列地图。但它也可以是源->映射->汇,可以完全链接。链中的记录不是序列化的,而是复制的(除非设置了enableObjectReuse(。我想这就是你对连载感到惊讶时的想法。

例如,如果您有多个输入或显式网络洗牌,则运营商链会断开。对于联接,两者都适用。因此数据被序列化。然而,你仍然可以在同一个TM上有两个连续的子任务。这就是本地输入通道发挥作用的地方,与你所发现的相对应。本地输入通道的序列化使背压和检查点的处理比在给定步骤中某些记录被序列化而其他记录不被序列化要容易得多。

最新更新