我正在尝试弄清楚它是如何发生的:我正在从多个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() ...
}
但是,当我在集群上运行工作时,我发现所有源任务都安排到一台机器上,因此机器成为性能的严重瓶颈。有什么想法如何发生?
谢谢!
所有不同SocketTextStreamFunction
源被安排到同一机器的原因是插槽共享。插槽共享允许Flink将属于不同运算符的任务安排到同一插槽中。例如,这使得在彼此之间取决于依赖的任务之间(例如,构建侧,探测端和实际连接操作员在同一插槽中运行)。此外,它使您可以更轻松地考虑您的应用程序需要多少个插槽,这是您工作的最大并行性。
然而,缺点是,您的工作的独立组件不会分布在集群中,但通常会由于插槽共享而最终置于同一插槽中(因此也在同一机器上)。
,如果您明确设置了一个不同的插槽共享组名称,则可以禁用工作部分的插槽共享。然后,只有分配给同一插槽共享组的操作员才能进行插槽共享。Down Stream运算符从其输入中继承了插槽共享组。因此,如果您有一个令人尴尬的并行工作,那么仅在来源的插槽共享组就足够了。
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() ...
}