因此,keyBy
或groupBy
会导致重新划分流的网络洗牌。据说它非常昂贵,因为它涉及到网络通信以及序列化和反序列化等。
例如,如果我运行以下操作符:
map(Mapper1).keyBy(0).map(Mapper2)
如果并行度为2,我会得到这样的结果:
Mapper1(1) --/- Mapper2(1)
X
Mapper1(2) -/-- Mapper2(2)
最后,Mapper1
中具有相同密钥的所有记录都被分配到Mapper2
中的相同分区。
我的问题是:
我想知道在流媒体中的keyBy
或groupBy
期间会发生什么。每个处理过的元素都被每个子任务序列化和反序列化?如何将keyBy
或groupBy
的成本与另一个操作进行比较?
此外,我熟悉批处理系统中partitioner的概念,但当我试图将其应用于流媒体时,我有点困惑。
谢谢!
因此Apache Flink缓冲任务的传出,然后将其发送到下一个任务进行处理。setBufferTimeout
是作业级别上的一个参数,可以通过StreamExecutionEnvironment
进行配置,此超时的默认值为100毫秒。在此之后,即使缓冲区未满,也会自动发送缓冲区。
此外,以下链接确实有助于了解详细信息:
https://flink.apache.org/2019/06/05/flink-network-stack.html
https://flink.apache.org/2019/07/23/flink-network-stack-2.html