Flink SocketTextStream源安排在一台机器上

时间:2017-09-18 19:04:22

标签: streaming apache-flink flink-streaming

我试图弄清楚它是如何发生的:我正在从多个socketTextStream读取一个程序,这些文本流会输入不同的数据流(这些数据流永远不会在我的工作中连接)。它看起来类似于下面的内容:

<form class="w3-container " >
            <h4>price</h4>
            <div>
            <input name= "priceLow" [(ngModel)]="SearchParams.PriceLow" placeholder="low cost">
            تا
            <input name= "priceHigh" [(ngModel)]="SearchParams.PriceHigh" placeholder="High cost">
            </div>

            <h4>Meter</h4>
            <div>
            <input name= "MeterLow" [(ngModel)]="SearchParams.MeterLow" placeholder="smallest">
            تا
            <input name= "MeterHigh" [(ngModel)]="SearchParams.MeterHigh"  placeholder="Highest">
            </div>

            <div >
              <h4>type</h4>

              <md-checkbox style="width:50%" name=" 1 " [(ngModel)]="SearchParams.HouseSelected">House</md-checkbox>
              <md-checkbox style="width:50%" name=" 2 " [(ngModel)]="SearchParams.ApartementSelected">apartment</md-checkbox>
            </div>

            <h4>room Number/h4>    
            <md-radio-group name="numberOfRooms" [(ngModel)]="SearchParams.NumOfRooms">
              <md-radio-button class="example-margin" value="1">1</md-radio-button>
              <md-radio-button class="example-margin" value="2">2</md-radio-button>
              <md-radio-button class="example-margin" value="3">3</md-radio-button>
              <md-radio-button class="example-margin" value="4">3+</md-radio-button>

          </form>

        </div>
    </div>

    <div>
      <app-results [SearchParams] = "this.SearchParams"></app-results>
    </div>

但是,当我在群集上运行作业时,我发现所有源任务都已安排到一台机器上,因此机器成为性能的严重瓶颈。任何想法会如何发生?

谢谢!

1 个答案:

答案 0 :(得分:0)

将所有不同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() ...
}