- Flink內核原理與實現
- 馮飛 崔鵬云 陳冠華編著
- 1519字
- 2021-04-14 11:30:31
2.2 API層次
API面向的是開發者,從縱向來看Flink中的API分為4個層次,從下而上,API層次越高,抽象程度越高,使用起來越方便,靈活性則會降低。
API層次如圖2-2所示。

圖2-2 Flink API層次
1.核心底層API
核心底層API提供了Flink的最底層的分布式計算構建塊的操作API,包含了ProcessFunction、狀態、時間和窗口等操作的API。
ProcessFunction是Flink提供的最具表現力的底層功能接口。Flink提供單流輸入的ProcessFunction和雙流輸入的CoProcessFunction,能夠對單個事件進行計算,也能夠按照窗口對時間進行計算。
ProcessFunction提供對時間和狀態的細粒度控制能力,它可以處理事件時間和處理時間兩種時間概念,在時間上定義、修改觸發回調函數的觸發器。因此,ProcessFunction可以實現許多有狀態計算中的復雜業務邏輯。
2.核心開發API (DataStream/DataSet API)
實際上,大多數應用程序不需要上述ProcessFunction的低級別抽象,使用核心開發API(如DataStream API處理實時數據流和DataSet API處理靜態數據集)足以應對絕大部分場景。
DataStream/DataSet使用Fluent風格API,提供了常見數據處理的API接口,如用戶指定的各種轉換形式,包括連接(Join)、聚合(Aggregation)、窗口(Window)、狀態(State)等。在這些API中處理的數據類型以各自的編程語言定義為Class類(Java類或者Scala類)。同時為了提供靈活性,DataStream/DataSet中也提供了直接使用底層ProcessFunction的能力,使得一些特定的操作可以實現更低層次的抽象如DataSet API為有界數據集提供了額外的原函數(如循環/迭代)。
3.聲明式DSL API
Table API是以表為中心的聲明式領域專用語言(Domain Specified Language,DSL)。表是關系型數據庫的概念,用在批處理中。在流計算中,為了引入了動態表的概念(Dynamic Table),用來表達數據流表,在批處理和流計算中統一了表的概念,后邊會介紹。
Table API遵循(擴展)關系模型,使用Schema定義元數據(與關系數據庫中的表相似),提供Table API實現SQL操作,如select、project、join、group-by、aggregate等。Table API表達的是“應該做什么”的邏輯操作,而不是編寫如何處理數據的底層代碼。Table API可以通過各種類型的用戶定義的函數進行擴展,雖然不如核心API表達能力強,但使用起來更加簡潔(少寫很多代碼)。
此外,Table API程序還可以通過在執行之前使用SQL優化器進行優化。可以在表和DataStream/DataSet之間無縫轉換,允許程序中混合使用Table API和DataStream/DataSet API。
4.結構化API
SQL是Flink的結構化API,是最高層次的計算API,與Table API基本等價,區別在于使用的方式。SQL與Table API可以混合使用,SQL可以操作Table API定義的表,Table API也能操作SQL定義的表和中間結果。
SQL對復雜邏輯的語義表達不如DataStream API,但是SQL也帶來了不少好處。
(1)縮短上線周期
傳統的實現流計算的方式是通過流計算平臺提供的API進行編程的,包括確定需求、實現設計、編寫代碼、進行本地單元測試、進行集成測試,沒有問題后部署上線等流程。整個開發過程中,開發人員不光要滿足業務需求,還需要關注技術實現的細節,而使用SQL的方式后,開發人員只要關注業務需求即可,技術實現的細節可以交給SQL引擎去解析、編譯、優化。最終,相比傳統的通過編碼實現流計算的方式,上線周期可以從數天縮短為數小時。
(2)更好地支持流計算需求的演變
隨著業務需求持續不斷的變化,編碼方式的開發、測試、部署上線的周期不能很快的響應業務需求的變化,使用SQL則能夠縮短開發、測試、部署的周期。
(3)自動調優
查詢優化器可以為用戶的SQL生成最高效的執行計劃。用戶不需要了解它就能自動享受優化器帶來的性能提升。
(4)接口穩定
SQL擁有幾十年的歷史,是一個非常穩定的語言,很少有變動。所以升級引擎的版本、甚至替換成另一個引擎時,都可以做到兼容并且平滑地升級。
(5)易于理解
SQL的學習門檻很低,很多不同行業不同領域的人都懂SQL,用SQL作為跨團隊的開發語言可以大大提高效率。
在Flink1.9及以后的版本中,Flink會在API層面上統一DataStream流處理API和DataSet批處理API,DataSet API會逐漸被廢棄,未來會使用DataStream API統一表達流批兩種處理,作為流批統一的計算引擎,這種做法是合理的。Google Cloud Dataflow開源的Apache Beam提供了一種流批統一API的實現范例。
本書重點闡述DataStream API和Table&SQL API。
- Big Data Analytics with Hadoop 3
- Instant Raspberry Pi Gaming
- TestStand工業自動化測試管理(典藏版)
- 快學Flash動畫百例
- Windows程序設計與架構
- ESP8266 Home Automation Projects
- 人工智能趣味入門:光環板程序設計
- Visual FoxPro數據庫基礎及應用
- The Python Workshop
- HTML5 Canvas Cookbook
- 工業機器人力覺視覺控制高級應用
- Unreal Development Kit Game Design Cookbook
- 30天學通Java Web項目案例開發
- 實戰Windows Azure
- Flash CS5二維動畫設計與制作