Flink Task 並行度


  1. 並行的數據流

    • Flink程序由多個任務(轉換/運算符,數據源和接收器)組成,Flink中的程序本質上是並行和分布式的。

    • 在執行期間,流具有一個或多個流分區,並且每個operator具有一個或多個operator*子任務*

    • operator子任務彼此獨立,並且可以在不同的線程中執行,這些線程又可能在不同的機器或容器上執行。

    • operator子任務的數量是該特定operator的並行度。

    • 流的並行度始終是其生成operator的並行度。

    • 同一程序的不同operator可能具有不同的並行級別。

    • 示意圖:

      image-20191113083419692

    • 流可以以一對一(或重新分配)模式或以重新分發模式在兩個運營商之間傳輸數據:

      • 一對一流
        • 如上圖中的Sourcemap運算符之間
        • 保留元素的分區和排序
        • 這意味着map運算符的subtask [1] 將看到與Source運算符的subtask [1]生成的順序相同的元素
      • 重新分配流
        • 在上面的mapkeyBy / window之間,以及 keyBy / windowSink之間重新分配流
        • 每個運算符子任務將數據發送到不同的目標子任務, 具體取決於所選的轉換。
        • 圖中是根據 keyby算子進行數據的重新分布。
  2. 任務並行度設置

    • 算子級別

      • 可以通過調用其setParallelism()方法來定義單個運算符,數據源或數據接收器的並行度。

                //1.初始化環境
                StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
                //2.讀取數據源,並進行轉換操作
                DataStream<Tuple2<String, Integer>> dataStream = env
                        .socketTextStream("ronnie01", 9999)
                        .flatMap(new Splitter())
                        .keyBy(0)
                        //每5秒觸發一批計算
                        .timeWindow(Time.seconds(5))
                        // 設置並行度
                        .sum(1).setParallelism(3);
        
    • 執行環境級別

      • 執行環境級別的並行度是本次任務中所有的操作符,數據源和數據接收器的並行度。

      • 可以通過顯式的配置運算符並行度來覆蓋執行環境並行度。

                //1.初始化環境
                StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
                
                env.setParallelism(3);
        
    • 客戶端級別

      • 在向Flink提交作業時,可以在客戶端設置並行度,通過使用指定的parallelism參數-p。
      • 例如:
        • ./bin/flink run -p 10 ../examples/WordCount-java.jar
    • 系統級別

      • 通過設置flink_home/conf/flink-conf.yaml 配置文件中的parallelism.default配置項來定義默認並行度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM