flink:StreamExecutionEnvironment、DataStream和Transformation與StreamOperator

wangwei0721發表於2020-11-30

1、StreamExecutionEnvironment:
StreamExecutionEnvironment是構建執行任務環境以及任務的啟動的入口,主要具備以下幾方面的職責:
a、儲存全域性相關的引數,如執行環境配置ExecutionConfig、檢查點配置CheckpointConfig,任務的轉換運算元transformations等等;
private final ExecutionConfig config = new ExecutionConfig();
執行環境的相關配置
private final CheckpointConfig checkpointCfg = new CheckpointConfig();
檢查點的相關配置
protected final List<Transformation<?>> transformations = new ArrayList<>();
transformations是轉換運算元的集合,但不包含source,構建任務時進一步轉化為DataStream。

b、對外提供統一的建立ExecutionEnvironment入口,他提供了一些靜態方法,如getExecutionEnvironment方法;
補充一點,local模式啟動時,如果引入了flink-runtime-web期望使用web-UI時,可以通過createLocalEnvironmentWithWebUI方法建立執行環境
StreamExecutionEnvironment streamEnv = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
預設埠是8081或者通過Configuration指定,如不使用此方法建立,則每次啟動會隨機生成一個埠來使用。

c、提供一些列的全域性引數的配置/獲取入口,諸如set/get/enable等方法;
如設定並行度、檢查點、chain開關等等

d、如果把flink的流計算過程簡單理解為資料輸入->轉換計算->資料輸出的三部曲的話,這裡作為入口提供了關於資料輸入的一些列新增資料輸入的方法;
如formXXX集合系列、addSource資料來源系列,socket/file系列等等。

e、提供計算任務啟動執行的入口。
StreamExecutionEnvironment有兩個子類,分別是LocalStreamEnvironment和RemoteStreamEnvironment,LocalStreamEnvironment用於構建和執行基於本地jvm程式的計算任務,RemoteStreamEnvironment用於構建和提交基於遠端flink叢集的計算任務。

2、DataStream

DataStream個人理解是流式資料處理的核心API,同時也是對轉換運算元Transformation的進一步封裝,在持有某一個運算元資料的同時也持有StreamExecutionEnvironment執行環境物件,按照操作的物件和型別可以簡單劃分為四大類:
a、對於單條資料的操作:如map、filter等操作
b、對於多條資料的操作:如keyBy、partition等操作
c、對多個流轉換合併為1個流的操作:如union、connect等操作
d、對1個流拆分為多個流的操作:如split操作
該類的整合體系如下圖所示,可自行理解對應到上面的分類,當然在org.apache.flink.streaming.api.datastream包下面還定義了一些其他的Stream暫不在本次談論範圍之列:

3、Transformation
Transform被定義為了一個抽象類,在另一篇分析https://www.cnblogs.com/wangwei0721/p/14012174.htmlStreamGraph生成過程中有涉及,再看一次他的整合體系

同樣的,一方面可以將運算元轉換的分類與DataStream對運算元的操作的分類對應起來,同時從另一個維度來看,也可以簡單的將Transformation劃分為以下兩類:
a、繼承自PhysicalTransformation的一些服務運算元轉換
在PhysicalTransformation抽象類中,定義了public abstract void setChainingStrategy(ChainingStrategy strategy);模板方法,該方法要求其子類提供運算元合併策略ChainingStrategy,該引數在後續計算優化運算元合併時會用到。
ps:ChainingStrategy是一個列舉類,有HEAD、NEVER和ALWAYS三個列舉值,HEAD標識該運算元僅作為頭,不參與合併鏈,但支援後繼合併到自己,NEVER標識該運算元既不向前合併也不被後繼合併,要作為獨立節點處理,ALWAYS標識該運算元的合併意願很強,支援隨時按規則合併。
在PhysicalTransformation的子類中,由於該全部子類是支援執行物理轉換,意思是說該運算元時一定產生資料輸入和輸出的,所以在全部子類中都Transformation作為input同時持有一個StreamOperatorFactory物件,用於產生對應的StreamOperator將來作為outPut;
b、其他的邏輯運算元轉換
其他邏輯轉換運算元則僅持有Transformation作為input輸入以及一些其他的屬性。

4、StreamOperator
StreamOperator是一個介面,標識了流計算的具體運算元轉換物件介面,具備相關的生命週期、快照等行為。

5、把這四個類放一起分析的原因
研究下flink原始碼,不難看出以上四個類可以理解為都是位於DataStream API層,他們承載了將使用者的輸入程式化構建為DAG圖,將計算邏輯進行互相合理轉化,弄清楚他們的屬性和行為對進一步分析flink原始碼是很有必要的。

相關文章