簡體   English   中英

Flink 中的 windowAll 運算符是否將並行化縮小到 1?

[英]Does windowAll operator in Flink scale down the parallelization to 1?

我在 Flink 中有一個流,它從源發送多維數據集,對多維數據集進行轉換(向多維數據集中的每個元素加 1),然后最后將其發送到下游以打印每秒的吞吐量。

該流在 4 個線程上並行化。

如果我理解正確, windowAll運算符是一個非並行轉換,因此應該將並行化縮小到 1,並通過將其與TumblingProcessingTimeWindows.of(Time.seconds(1))一起使用,將所有並行TumblingProcessingTimeWindows.of(Time.seconds(1))任務的吞吐量相加最新的一秒並打印出來。 我不確定我是否得到正確的輸出,因為每秒的吞吐量是這樣打印的:

1> 25
2> 226
3> 354
4> 372
1> 382
2> 403
3> 363
...

問題:流打印機是否打印每個線程(1、2、3 和 4)的吞吐量,還是僅選擇例如線程 3 來打印所有子任務的吞吐量總和?

當我在開頭env.setParallelism(1)中將環境的並行度設置為 1 時,在吞吐量之前我沒有得到“x>”,但我似乎獲得了與它相同(甚至更好)的吞吐量設置為 4。像這樣:

45
429
499
505
1
503
524
530
...

這是該程序的代碼片段:

imports...

public class StreamingCase {
    public static void main(String[] args) throws Exception {
        int parallelism = 4;

        final StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
        env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
        env.setParallelism(parallelism);

        DataStream<Cube> start = env
                .addSource(new CubeSource());

        DataStream<Cube> adder = start
                .map(new MapFunction<Cube, Cube>() {
                    @Override
                    public Cube map(Cube cube) throws Exception {
                        return cube.cubeAdd(1);
                    }
                });

        DataStream<Integer> throughput = ((SingleOutputStreamOperator<Cube>) adder)
                .windowAll(TumblingProcessingTimeWindows.of(Time.seconds(1)))
                .apply(new AllWindowFunction<Cube, Integer, TimeWindow>() {
                    @Override
                    public void apply(TimeWindow tw,
                                      Iterable<Cube> values,
                                      Collector<Integer> out) throws Exception {
                        int sum = 0;
                        for (Cube c : values)
                            sum++;
                        out.collect(sum);
                    }
                });
        throughput.print();
        env.execute("Cube Stream of Sweetness");
    }
}

如果環境的並行度設置為 3 並且您使用的是 WindowAll 運算符,則只有窗口運算符以並行度 1 運行。接收器仍將以並行度 3 運行。因此,計划如下所示:

In_1 -\               /- Out_1
In_2 --- WindowAll_1 --- Out_2
In_3 -/               \- Out_3

WindowAll 運算符使用循環策略將其輸出發送到其后續任務。 這就是不同線程發出程序結果記錄的原因。

當您將環境並行度設置為 1 時,所有操作符都會運行一個任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM