Flink的DataStream的詳細介紹


一:流處理的基本概念

  流處理系統本身有很多自己的特點。一般來說,由於需要支持無限數據集的處理,流處理系統一般采用一種數據驅動的處理方式。它會提前設置一些算子,然后等到數據到達后對數據進行處理。

  為了表達復雜的邏輯,flink在內的分布式流處理引擎,一般采用 DAG 圖來表示整個計算邏輯,其中 DAG 圖中的每一個點就代表一個基本的邏輯單元,也就是前面說的算子,由於計算邏輯被組織成有向圖,數據會按照邊的方向,從一些特殊的 Source 節點流入系統,然后通過網絡傳輸、本地傳輸等不同的數據傳輸方式在算子之間進行發送和處理,最后會通過另外一些特殊的 Sink 節點將計算結果發送到某個外部系統或數據庫中。

 

 

 

  上圖中的邏輯模型所說的是我們整體項目的一個內部邏輯關系, 但是由於我們所使用的的算子可能有多個處理實例,例如c這個算子可能有兩個實例,所以物理上又會有一定的上游和下游的關系。但是只有算子的實例不在同一個進程上運行時,才會出現網絡傳輸,算子的實例在同一個進程中是不會存在網絡傳輸的。

二:DataStream的基本轉換

 

說明:該圖說明DataStream是產生其它流的一個基礎,當我們讀進來數據的時候,首先生成的是DataStream,在通過其它的算子產生別的Stream,例如通過KeyBy產生KeyedStream,之后可以在進行一些window操作,產生WindowedStream。但是我們比較常用的是KeyedStream。

三:交換數據的物理分組方式

  Global: 上游算子將所有記錄發送給下游算子的第一個實例。

  Broadcast: 上游算子將每一條記錄發送給下游算子的所有實例。(小數據量)

  Forward:只適用於上游算子實例數與下游算子相同時,每個上游算子實例將記錄發送給下游算子對應的實例。

  Shuffle:上游算子對每條記錄隨機選擇一個下游算子實例進行發送。

  Rebalance:上游算子通過輪詢的方式發送數據。

  Rescale:本地輪詢的方式發送數據。

  PartitionCustomer:當上述內置分配方式不滿足需求時,用戶還可以選擇自定義分組方式。

四:支持的類型系統

  Flink DataStream 對像都是強類型的,每一個 DataStream 對象都需要指定元素的類型,Flink 自己底層的序列化機制正是依賴於這些信息對序列化等進行優化。具體來說,在 Flink 底層,它是使用 TypeInformation 對象對類型進行描述的,TypeInformation 對象定義了一組類型相關的信息供序列化框架使用。

類型 說明
基本類型 Java的基本類型(包裝類),以及void,String,Date等
復合類型 Tuple和scala的case class (不支持null,tuple不能超過25個字段),Row,PoJO
輔助、集合類型 Option,Map,List
上述類型的數組  
其他類型 自定義TypeInformation或kyro處理,但是不推薦使用

 

 

 

 

 

 

 五:DataStreamApi的原理介紹

  當我們調用 DataStream#map 算法時,Flink 在底層會創建一個 Transformation 對象,這一對象就代表我們計算邏輯圖中的節點。它其中就記錄了我們傳入的 MapFunction,也就是 UDF(User Define Function)。隨着我們調用更多的方法,我們創建了更多的 DataStream 對象,每個對象在內部都有一個 Transformation 對象,這些對象根據計算依賴關系組成一個圖結構,就是我們的計算圖。后續 Flink 將對這個圖結構進行進一步的轉換,從而最終生成提交作業所需要的 JobGraph。

這是我們代碼生成的數據轉換圖

 

運行時產生的算子圖是這樣的

 

 轉換圖中的一些轉換包括union、split、select 最終都是將數據源連接到map算子,所以會在運行的時候產生這樣的圖例。


免責聲明!

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



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