-
並行的數據流
-
Flink程序由多個任務(轉換/運算符,數據源和接收器)組成,Flink中的程序本質上是並行和分布式的。
-
在執行期間,流具有一個或多個流分區,並且每個operator具有一個或多個operator*子任務*。
-
operator子任務彼此獨立,並且可以在不同的線程中執行,這些線程又可能在不同的機器或容器上執行。
-
operator子任務的數量是該特定operator的並行度。
-
流的並行度始終是其生成operator的並行度。
-
同一程序的不同operator可能具有不同的並行級別。
-
示意圖:
-
流可以以一對一(或重新分配)模式或以重新分發模式在兩個運營商之間傳輸數據:
- 一對一流
- 如上圖中的Source和map運算符之間
- 保留元素的分區和排序
- 這意味着map運算符的subtask [1] 將看到與Source運算符的subtask [1]生成的順序相同的元素
- 重新分配流
- 在上面的map和keyBy / window之間,以及 keyBy / window和Sink之間重新分配流
- 每個運算符子任務將數據發送到不同的目標子任務, 具體取決於所選的轉換。
- 圖中是根據 keyby算子進行數據的重新分布。
- 一對一流
-
-
任務並行度設置
-
算子級別
-
可以通過調用其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配置項來定義默認並行度。
-