流媒体中的网络随机播放
Network shuffle in streaming
因此,keyBy
或 groupBy
导致重新分区流的网络随机播放。据说很贵,因为它涉及到网络通信以及序列化和反序列化等
例如,如果我 运行 以下运算符:
map(Mapper1).keyBy(0).map(Mapper2)
并行度为 2,我会得到这样的结果:
Mapper1(1) -\-/- Mapper2(1)
X
Mapper1(2) -/-\- Mapper2(2)
最后 Mapper1
中具有相同键的所有记录都分配给 Mapper2
中的相同分区。
我的问题是:
我想知道在 keyBy
或 groupBy
期间发生了什么。每个处理过的元素都由每个子任务序列化和反序列化?如何比较 keyBy
或 groupBy
与另一个操作的成本?
此外,我熟悉批处理系统中分区器的概念,但是当我尝试在流式处理中应用它时,我有点困惑。
谢谢!
所以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
因此,keyBy
或 groupBy
导致重新分区流的网络随机播放。据说很贵,因为它涉及到网络通信以及序列化和反序列化等
例如,如果我 运行 以下运算符:
map(Mapper1).keyBy(0).map(Mapper2)
并行度为 2,我会得到这样的结果:
Mapper1(1) -\-/- Mapper2(1)
X
Mapper1(2) -/-\- Mapper2(2)
最后 Mapper1
中具有相同键的所有记录都分配给 Mapper2
中的相同分区。
我的问题是:
我想知道在 keyBy
或 groupBy
期间发生了什么。每个处理过的元素都由每个子任务序列化和反序列化?如何比较 keyBy
或 groupBy
与另一个操作的成本?
此外,我熟悉批处理系统中分区器的概念,但是当我尝试在流式处理中应用它时,我有点困惑。
谢谢!
所以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