- 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上使用異步函數的能力。
- 構建高質量的C#代碼
- Splunk 7 Essentials(Third Edition)
- Mastering Hadoop 3
- PowerShell 3.0 Advanced Administration Handbook
- Java實用組件集
- 數據挖掘實用案例分析
- 大學計算機應用基礎
- 新手學電腦快速入門
- 從零開始學SQL Server
- Pentaho Analytics for MongoDB
- Visual Studio 2010 (C#) Windows數據庫項目開發
- INSTANT VMware vCloud Starter
- Artificial Intelligence By Example
- FANUC工業機器人配置與編程技術
- Mastering OpenStack(Second Edition)