flink:StreamExecutionEnvironment、DataStream和Transformation與StreamOperator


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源碼是很有必要的。


免責聲明!

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



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