我试图弄清楚它是如何发生的:我让一个程序从多个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() ...
}
然而,当我在集群上运行作业时,我发现所有源任务都被调度到一台机器上,因此这台机器成为性能的严重瓶颈。你知道怎么会这样吗?
谢谢!
1条答案
按热度按时间czq61nw11#
所有不同的原因
SocketTextStreamFunction
源被调度到同一台计算机是因为插槽共享。插槽共享允许flink将属于不同操作员的任务调度到同一个插槽中。例如,这允许在相互依赖的任务(例如,在同一插槽中运行的构建端、探测端和实际连接操作符)之间实现更好的共定位。此外,它还可以更容易地推断应用程序需要多少插槽,这是作业的最大并行度。但是,缺点是,由于插槽共享,作业的独立组件不会分布在集群中,但通常会在同一个插槽中结束(因此也在同一台机器上)。
如果显式设置不同的插槽共享组名称,则可以禁用部分作业的插槽共享。则只有分配给同一时隙共享组的运算符才进行时隙共享。下游运算符从其输入继承插槽共享组。因此,如果您有一个令人尴尬的并行作业,那么仅在源位置设置插槽共享组就足够了。