官术网_书友最值得收藏!

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.核心開發APIDataStream/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。

主站蜘蛛池模板: 揭东县| 剑川县| 景谷| 五寨县| 克什克腾旗| 清水县| 中宁县| 罗江县| 汕尾市| 库尔勒市| 永安市| 遵义县| 巴马| 遵化市| 平和县| 巨鹿县| 安陆市| 临沂市| 台前县| 台北市| 平遥县| 香河县| 赣州市| 增城市| 青岛市| 乃东县| 南乐县| 长宁县| 社旗县| 南岸区| 密山市| 久治县| 湖口县| 儋州市| 星子县| 滦南县| 台东县| 武山县| 西吉县| 天气| 和政县|