1. 程式人生 > >[原始碼解析] 當 Java Stream 遇見 Flink

[原始碼解析] 當 Java Stream 遇見 Flink

# [原始碼解析] 當 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