flink sockettextstream源调度到一台机器

jm81lzqq  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(452)

我试图弄清楚它是如何发生的:我让一个程序从多个sockettextstream读取文本流,这些文本流馈送到不同的数据流中(这些数据流在我的工作中从未连接)。它看起来类似于以下内容:

for(int i =0; i< hosts.length; i++) {

    DataStream<String> someStream = env.socketTextStream(hosts[i], ports[i]);
    DataStream<Tuple2<String, String>> joinedAdImpressions = rawMessageStream.rebalance() ...
}

然而,当我在集群上运行作业时,我发现所有源任务都被调度到一台机器上,因此这台机器成为性能的严重瓶颈。你知道怎么会这样吗?
谢谢!

czq61nw1

czq61nw11#

所有不同的原因 SocketTextStreamFunction 源被调度到同一台计算机是因为插槽共享。插槽共享允许flink将属于不同操作员的任务调度到同一个插槽中。例如,这允许在相互依赖的任务(例如,在同一插槽中运行的构建端、探测端和实际连接操作符)之间实现更好的共定位。此外,它还可以更容易地推断应用程序需要多少插槽,这是作业的最大并行度。
但是,缺点是,由于插槽共享,作业的独立组件不会分布在集群中,但通常会在同一个插槽中结束(因此也在同一台机器上)。
如果显式设置不同的插槽共享组名称,则可以禁用部分作业的插槽共享。则只有分配给同一时隙共享组的运算符才进行时隙共享。下游运算符从其输入继承插槽共享组。因此,如果您有一个令人尴尬的并行作业,那么仅在源位置设置插槽共享组就足够了。

for(int i =0; i< hosts.length; i++) {
    DataStream<String> someStream = env
       .socketTextStream(hosts[i], ports[i])
       .slotSharingGroup("socket_" + i);

    DataStream<Tuple2<String, String>> joinedAdImpressions = rawMessageStream.rebalance() ...
}

相关问题