官术网_书友最值得收藏!

  • Flink內核原理與實現
  • 馮飛 崔鵬云 陳冠華編著
  • 1118字
  • 2021-04-14 11:30:31

2.3 數據流

對Flink這種以流為核心的分布式計算引擎而言,數據流是核心數據抽象,表示一個持續產生的數據流,與Apache Beam中的PCollection的概念類似。在Flink中使用DataStream表示數據流,DataStream是一種邏輯概念,并不是底層執行的概念。DataStream上定義了常見的數據處理操作API(轉換為Transformation),同時也具備自定義數據處理函數的能力,當DataStream提供的常見操作不滿足需求的時候,可以自定義數據處理的邏輯。

DataStream體系如圖2-3所示。

圖2-3 DataStream體系

DataStreamSource本身就是一個DataStream。DataStreamSink、AsyncDataStream、BroadcastDataStream、BroadcastConnectedDataStream、QueryableDataStream都是對一般DataStream對象的封裝,在DataStream實現特定的功能,接下來對這些DataStream一一進行介紹。

1. DataStream

DataStream是Flink數據流的核心抽象,其上定義了對數據流的一系列操作,同時也定義了與其他類型DataStream的相互轉換關系。每個DataStream都有一個Transformation對象,表示該DataStream從上游的DataStream使用該Transformation而來。

2. DataStreamSource

DataStreamSource是DataStream的起點,DataStreamSource在StreamExecutionEnvironment中創建,由StreamExecutionEnvironment.addSource(SourceFunction)創建而來,其中SourceFunction中包含了DataStreamSource從數據源讀取數據的具體邏輯。

3. DataStreamSink

數據從DataSourceStream中讀取,經過中間的一系列處理操作,最終需要寫出到外部存儲,通過DataStream.addSink(sinkFunction)創建而來,其中SinkFunction定義了寫出數據到外部存儲的具體邏輯。

4. KeyedStream

KeyedStream用來表示根據指定的key進行分組的數據流。一個KeyedStream可以通過調用DataStream.keyBy()來獲得。而在KeyedStream上進行任何Transformation都將轉變回DataStream。在實現中,KeyedStream把key的信息寫入了Transformation中。每條記錄只能訪問所屬key的狀態,其上的聚合函數可以方便地操作和保存對應key的狀態。

5. WindowedStream & AllWindowedStream

WindowedStream代表了根據key分組且基于WindowAssigner切分窗口的數據流。所以WindowedStream都是從KeyedStream衍生而來的,在WindowedStream上進行任何Transformation也都將轉變回DataStream。

6. JoinedStreams & CoGroupedStreams

Join是CoGroup的一種特例,JoinedStreams底層使用CoGroupedStreams來實現。兩者的區別如下。

CoGrouped側重的是Group,對數據進行分組,是對同一個key上的兩組集合進行操作,可以編寫靈活的代碼來實現特定的業務功能。Join側重的是數據對,對同一個key的每一對元素進行操作。CoGroup更通用,但因為Join是數據庫上常見的操作,所以在CoGroup基礎上提供Join的特性。

JoinGroup和CoGroup兩者都是對持續不斷地產生的數據做運算,但是又不能無限地在內存中持有數據,對所有的數據進行Join的笛卡兒積操作理論上不可行(理論上內存不足可以刷出到磁盤,反復的硬盤讀寫會導致性能變得很差),所以在底層上,兩者都基于Window實現。

7. ConnectedStreams

ConnectedStreams表示兩個數據流的組合,兩個數據流可以類型一樣,也可以類型不一樣。ConnectedStreams適用于兩個有關系的數據流的操作,共享State。一種典型的場景是動態規則數據處理。兩個流中一個是數據流,一個是隨著時間更新的業務規則,業務規則流中的規則保存在State中,規則會持續更新State。當數據流中的新數據到來時,使用保存在State中的規則進行數據處理。

8. BroadcastStream & BroadcastConnectedStream

BroadcastStream實際上是對一個普通DataStream的封裝,提供了DataStream的廣播行為。

BroadcastConnectedStream一般由DataStream/KeyedDataStream與BroadcastStream連接而來,類似于ConnectedStream。

9. IterativeStream

IterativeDataStream是對一個DataStream的迭代操作,從邏輯上來說,包含IterativeStream的Dataflow是一個有向有環圖,在底層執行層面上,Flink對其進行了特殊處理。

10. AsyncDataStream

AsyncDataStream是個工具,提供在DataStream上使用異步函數的能力。

主站蜘蛛池模板: 聂荣县| 大悟县| 高要市| 舟曲县| 宣城市| 奉节县| 临沧市| 壤塘县| 旬邑县| 大名县| 奉贤区| 双辽市| 承德市| 和平区| 西盟| 荣昌县| 汕头市| 西华县| 定襄县| 客服| 囊谦县| 临泉县| 磴口县| 延长县| 岑溪市| 敦化市| 浙江省| 冀州市| 大关县| 五常市| 株洲县| 林西县| 益阳市| 奇台县| 禹州市| 新绛县| 新闻| 崇左市| 横山县| 塘沽区| 大同市|