我试图理解.yaml文档中flink的插槽和并行配置背后的逻辑。
官方的flink文档指出,对于cpu中的每个核心,必须同时分配1个插槽并将并行级别提高1。
但我想这只是一个建议。举个例子,如果我有一个强大的内核(例如,最新的i7最大的千兆赫),它不同于有一个有限的千兆赫旧cpu。因此,运行比我的系统的cpu maxcores更多的插槽和并行性并不是不合理的。
但是,除了测试不同的配置之外,还有其他方法可以用flink检查我的系统的最大能力吗?
作为记录,我使用flink的批处理pythonapi。
2条答案
按热度按时间rkue9o1l1#
建议为每个插槽分配至少一个cpu内核,因为每个操作符至少由一个线程执行。如果您不在运营商中执行阻塞呼叫,并且带宽足够高,可以不断向运营商提供新数据,那么每个cpu核心1个插槽应该可以让您的cpu保持繁忙。
另一方面,如果您的运营商发出阻塞调用(例如,与外部db通信),则有时配置比内核更多的插槽是有意义的。
5vf7fwbs2#
你的问题有几个有趣的地方。
首先,flink中的槽是每个taskmanager为集群带来的处理能力,它们首先限制了可以在集群上执行的应用程序的数量,以及同时可执行操作符的数量。暂时来说,计算机提供的处理能力不应超过其cpu单元。当然,如果在它上面运行的所有任务都是cpu计算密集型的,并且是低io操作,那么这是正确的。如果您的应用程序中有被io操作高度阻塞的运算符,那么配置比taskmanager中可用的cpu内核更多的插槽是没有问题的,正如@till\rohrmann所说。
另一方面,默认的并行性是flink集群中应用程序可用的cpu内核数,尽管在运行应用程序或在代码中指定它时,可以手动将其指定为参数。请注意,flink集群可以同时运行多个应用程序,除非它是目标,否则只阻塞整个集群是不方便的,因此,默认并行度通常小于集群中可用的插槽数(taskmanagers贡献的所有插槽的总和)。
但是,parallelism 4的应用程序暂时意味着,如果它包含一个stream:input().map().reduce().sink(),则每个操作符应该有4个示例,因此,应用程序使用的核心总数大于4。但是,这是flink的开发者应该解释的;)