[原始碼解析] 當 Java Stream 遇見 Flink
阿新 • • 發佈:2020-08-17
# [原始碼解析] 當 Java Stream 遇見 Flink
[ToC]
## 0x00 摘要
在分析Alink原始碼的時候,發現Alink使用了 Java Stream,又去Flink原始碼搜尋,發現Flink也有大量使用。一時興起,想看看 Java Stream 和 Flink 這種流處理框架的異同點。當然這種比較還是注重於理念和設計思路上的。因為就應用領域和複雜程度來說, Java Stream 和 Flink 屬於數量級別的差距。
因為Flink的分析文章我寫了一些,所以本文原始碼的分析重點在Java Stream上。
## 0x01 領域
### 1.1 Flink
從幾個權威來源可以看看Flink本質:
- 我們直接從官網找出Flink本質:**Apache Flink® — Stateful Computations over Data Streams**,即 **資料流上的有狀態計算**。
- 從github上看:Apache Flink is an open source stream processing framework with powerful stream- and batch-processing capabilities.
- 從百度百科上看:Flink 其核心是用Java和Scala編寫的分散式流資料流引擎。Flink以資料並行和流水線方式執行任意流資料程式,Flink的流水線執行時系統可以執行批處理和流處理程式。
因此可以總結如下:Flink 是分散式流資料計算,引擎,框架,系統,各種高大上 …… 。
### 1.2 Java Stream
直接看 java doc
Stream :A sequence of elements supporting sequential and parallel aggregate operations.
從其他網址看:
Java 8 API 添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。
- 這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。
- 元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。
因此可以看到,Java Stream 是流抽象API,可以使用並行操作。
### 1.3 探尋角度
因此我們可以看出,**Flink 和 Java Stream 最值得比較的三個方面就是:資料流模型,流水線,資料並行**。
下面我們就從這三個角度來分析。
## 0x02 資料流模型
### 2.1 Java Stream
Stream程式設計風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。
元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。
```java
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
```
以上的流程轉換為 Java 程式碼為:
```j