Flink 中插槽的资源过度分配

Lui*_*ves 5 apache-flink

关于 Flink 上允许优化集群中资源使用的特性(+延迟、吞吐量...),即槽共享、任务链、异步 I/O 和动态扩展,我想问以下问题(全部在流处理上下文):

  1. 在哪些情况下,有人会对任务管理器中的插槽数高于 cpu 内核数感兴趣?

  2. 在哪种情况下,我们应该更喜欢在多个插槽上拆分任务管道(禁用插槽共享),而不是增加并行度,以便应用程序跟上传入的数据速率?

  3. 有没有可能,即使使用了上述所有特性,为一个slot预留的资源也可能高于该slot中所有任务所需的资源量,从而导致我们有为一个slot预留的资源,但没有正在使用?当我们在具有不同延迟(或不同并行度)的应用程序中执行任务时,是否可能出现此类问题?或者甚至当我们在同一个窗口上执行多个聚合(不能使用折叠或减少进行优化)时?

提前致谢。

Til*_*ann 4

  1. 通常,建议为每个插槽至少预留一个CPU核心。您希望保留比核心更多的插槽的原因之一是您在运算符中执行阻塞操作。这样你就可以让你的所有核心都忙碌起来。

  2. 如果您发现您的应用程序无法跟上传入数据速率,那么通常最好增加并行度(假设瓶颈不是并行度为 1 的运算符,并且您的数据具有足够的键值)。

    如果一个管道中有多个计算密集型运算符(甚至可能是链接的),并且每个插槽的内核数少于这些运算符,那么拆分管道可能是有意义的。这样这些运算符的计算可以更好地同时完成。

  3. 理论上,您向插槽分配的资源可能多于实际需要的资源。例如,每个插槽中有一个操作员,但分配有多个核心。此外,在运算符并行度不同的情况下,某些槽可能会比其他槽分配更多的子任务。您始终可以做的一件事是监控作业的执行情况,以检测配置不足和过度配置的情况。