不平衡的Flink流负载

时间:2019-08-02 09:34:27

标签: apache-flink

https://imgur.com/jdisF4T

我有一个4节点的独立Flink集群。在每个节点(TM A,TM B,TM C,TM D)上都有一个TaskManager,每个TaskManager都有2个插槽(A1,A2,B1,...,D2)。

作业的来源与并行性一起运行8。 来源中有6个map / flatMap(所有参数均与标准杆2相同)。

在检查流程时,发现所有flatMap操作都使用同一TM的插槽(可以),但是整个工作仅使用2个TM。因此负载非常不平衡。

为什么这是行为?如何平衡负载?

2 个答案:

答案 0 :(得分:0)

我假设par 2表示并行度2。

因此您的作业具有默认的并行度8,但是您正在为flatMap运算符更改此默认并行度。因此,每个flatMap运算符将使用8个可用插槽中的2个。

问题是,为什么您的运营商没有部署到不同的插槽,而是使用相同的插槽。可能的关键是您启用了运算符链接,其中运算符将在同一插槽中使用相同的线程来优化它们。 因此,根据您的图片,flatMap 1可能与flatMap 5链接在一起,flatMap 2则与3、4和6链接在一起。

尝试禁用操作员链接并重新部署应用程序,可能会将您的操作员部署在更多TaskManager中。 如果您想对链接进行细粒度的控制,则可以手动进行操作,或者您可以考虑删除每个运算符的并行性,而保留默认的作业并行性。

https://ci.apache.org/projects/flink/flink-docs-stable/concepts/runtime.html#tasks-and-operator-chains

答案 1 :(得分:0)

有几个相关因素:

  1. 默认情况下,每当一个操作员直接转发到下一个操作员时,这些操作员就会链接在一起,以避免序列化和网络开销。
  2. 默认情况下,插槽数等于最大并行度,并且分配了每个插槽以执行应用程序的一个完整片段(每个运算符的一个实例)。如果您想更好地控制任务分配给插槽,可以设置插槽共享组以将特定的操作员或一组操作员隔离到自己的插槽中。
  3. Flink调度程序将任务分配给任务插槽,而无需考虑本地性-它仅根据插槽而不是任务管理器来考虑。对于如何更好地将负载分散到可用计算机上(例如https://issues.apache.org/jira/browse/FLINK-11815)和提供更明确的控制(请参阅https://issues.apache.org/jira/browse/FLINK-11166),已有一些讨论。