有没有一种方法可以确定总的作业并行性或运行Flink作业所需的插槽数(在运行之前)

时间:2019-09-05 00:48:27

标签: apache-flink flink-streaming flink-cep flink-sql

是否有一种方法可以从执行计划或以其他方式确定运行作业所需的任务插槽总数,而不必先真正开始作业。

根据此文档:https://ci.apache.org/projects/flink/flink-docs-stable/concepts/runtime.html

  

“ Flink集群所需的任务槽与作业中使用的最高并行度恰好一样。无需计算程序总共包含多少个任务(并行度各不相同)。”

如果我从StreamExecutionEnvironment获取执行计划(设置后但未实际执行作业),并从执行计划json的节点列表中获取任何节点的最大并行度,那么这足以确定任务数运行作业所需的插槽。

在任何情况下都不再是这种情况吗?还是要注意任何警告?

1 个答案:

答案 0 :(得分:0)

在一般情况下,可以通过以下方式计算给定Flink作业所需的插槽数:对于每个slot sharing group g(表示可以部署到同一操作员中的一组操作员)插槽),则需要找到具有最大并行度p_max_g的运算符。现在,需要为作业slots = sum_(g in G) p_max_g中的每个插槽共享组加起来这些数字,以便获得所需的插槽数。

在大多数情况下(如果用户未设置任何插槽共享组),则应该仅存在一个插槽共享组G = {g}。这使得Flink可以将每个操作员的一个子任务部署到一个相同的插槽中。

一种特殊情况是批处理作业(绑定流),如果它们使用阻塞数据交换。在这种情况下,一个接一个地可以依次运行不同的插槽共享组(假设它们与阻塞数据交换/操作员边缘对齐)。

不幸的是,ExecutionEnvironment.getExecutionPlan不打印操作员的插槽共享组。因此,仅在只有一个插槽共享组的情况下,才根据严格的执行计划计算所需的插槽数。