如果我在Flink中调用一个rescale()操作,我假设没有序列化/反序列化(因为数据不是跨节点的),对吗?此外,当调用rescale()时,假定对象没有被复制/深度复制是正确的吗?
我之所以这样问,是因为我传递了一些大型对象,其中99%在多个线程之间是常见的,因此,如果对象在rescale()之后在每个线程中被回收,这将是巨大的内存浪费。相反,所有不同的线程都应该指向该节点的java堆中的同一个对象。
(当然,如果我调用一个rebalance,那么即使在其他节点上有几十个线程,也会有一个公共对象序列化到其他节点?)也就是说,在其他节点上,应该只有一个公共对象的副本,该节点的所有线程都可以共享这个副本,对吗?)
发布于 2022-08-02 14:47:05
根据重碱()文档,将出现网络通信量(因此也会出现序列化/反序列化),只是不像rebalance()那样多。但是,正如一些Flink提交者所指出的,与不平衡的数据相比,数据倾斜可以使网络流量的减少变得微不足道,这就是为什么当流拓扑发生变化时,rebalance()是默认操作。
另外,如果您正在传递大量公共数据,那么也许可以考虑使用广播流来更有效地在节点间共享这些数据。
最后,在概念上更容易考虑子任务与线程之间的关系。每个操作符作为子任务运行,这个子任务(在一个任务管理器上)确实是线程化的,但是操作符实例是独立的,这意味着您不必担心操作符级别的多线程(除非您使用类变量,这通常是一个糟糕的想法)。
https://stackoverflow.com/questions/73201150
复制相似问题