Flink 中的 API #
Flink 為流式/批式處理應用程式的開發提供了不同級別的抽象。
Programming levels of abstraction
Flink API 最底層的抽象為有狀態實時流處理。其抽象實現是 Process Function,並且 Process Function 被 Flink 框架整合到了 DataStream API 中來為我們使用。它允許使用者在應用程式中自由地處理來自單流或多流的事件(資料),並提供具有全域性一致性和容錯保障的狀態。此外,使用者可以在此層抽象中註冊事件時間(event time)和處理時間(processing time)回撥方法,從而允許程式可以實現複雜計算。
Flink API 第二層抽象是 Core APIs。實際上,許多應用程式不需要使用到上述最底層抽象的 API,而是可以使用 Core APIs 進行程式設計:其中包含 DataStream API(應用於有界/無界資料流場景)和 DataSet API(應用於有界資料集場景)兩部分。Core APIs 提供的流式 API(Fluent API)為資料處理提供了通用的模組元件,例如各種形式的使用者自定義轉換(transformations)、聯接(joins)、聚合(aggregations)、視窗(windows)和狀態(state)操作等。此層 API 中處理的資料型別在每種程式語言中都有其對應的類。
Process Function 這類底層抽象和 DataStream API 的相互整合使得使用者可以選擇使用更底層的抽象 API 來實現自己的需求。DataSet API 還額外提供了一些原語,比如迴圈/迭代(loop/iteration)操作。
Flink API 第三層抽象是 Table API。Table API 是以表(Table)為中心的宣告式程式設計(DSL)API,例如在流式資料場景下,它可以表示一張正在動態改變的表。Table API 遵循(擴充套件)關係模型:即表擁有 schema(類似於關係型資料庫中的 schema),並且 Table API 也提供了類似於關係模型中的操作,比如 select、project、join、group-by 和 aggregate 等。Table API 程式是以宣告的方式定義應執行的邏輯操作,而不是確切地指定程式應該執行的程式碼。儘管 Table API 使用起來很簡潔並且可以由各種型別的使用者自定義函式擴充套件功能,但還是比 Core API 的表達能力差。此外,Table API 程式在執行之前還會使用最佳化器中的最佳化規則對使用者編寫的表示式進行最佳化。
表和 DataStream/DataSet 可以進行無縫切換,Flink 允許使用者在編寫應用程式時將 Table API 與 DataStream/DataSet API 混合使用。
Flink API 最頂層抽象是 SQL。這層抽象在語義和程式表示式上都類似於 Table API,但是其程式實現都是 SQL 查詢表示式。SQL 抽象與 Table API 抽象之間的關聯是非常緊密的,並且 SQL 查詢語句可以在 Table API 中定義的表上執行。