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

1.3 Flink的API

本節我們進入Flink API的學習階段,通過本節的介紹,我們可以知道使用哪門語言、寫什么樣的代碼才能完成Flink作業的開發。

如圖1-10所示,Flink為我們抽象了4種級別的API,分別是SQL API、Table API、DataStream API和有狀態流處理API。

越往上,API的標準化程度越高,處理的數據的結構化程度也越高,同時,API也越簡單,用戶越容易理解和使用。注意,雖然越往上標準化程度越高,但是使用API時的靈活性也會越來越低,因此上層API常用于處理數據結構相對標準化的簡單需求,下層API常用于處理個性化的復雜需求。

圖1-10 Flink提供的4種API

提示

圖1-10中的Table API是一種聲明式DSL,使用聲明式DSL開發Flink作業時只需要表達數據是怎樣處理的、期望得到怎樣的結果,而不需要去詳細實現數據處理的邏輯。在Flink中,Table API、SQL API都是聲明式DSL。以SQL API為例,用戶通過一條SQL語句描述數據應該怎樣處理,然后提交并執行Flink SQL API作業就可以得到數據結果;而DataStream API和有狀態流處理API嚴格來說都是非聲明式API,用戶需要詳細實現數據的處理邏輯。

對于初學者來說,要做到清晰地理解和劃分這4種API不太容易,因此我按照編寫Flink作業時的編碼方式將這4種API劃分為兩類,分別是Code API和關系型API,如圖1-11所示。

1.3.1 Code API

Code API指需要通過Java、Scala、Python編程語言編寫具體的數據處理邏輯來完成Flink作業開發,Flink提供的DataStream API和有狀態流處理API屬于此類。

圖1-11 4種API再分類

1.DataStream API

我們使用Java、Python、Scala編程語言以及Flink針對這3種語言提供的DataStream API來開發一個Flink作業。

代碼清單1-1所示是使用Flink為Java提供的DataStream API開發的Flink作業,DataStream API名稱源自DataStream類。在Flink 1.14之前的版本中,Flink針對批處理還提供了DataSet API,而在1.14及之后的版本中,Flink將流處理和批處理API統一到了DataStream API中,我們可以直接使用DataStream API開發流處理任務以及批處理任務。

代碼清單1-1 DataStream API案例

DataStream API是日常開發中最常用的一種API,它預置了各種類型的數據源(Source)、數據轉換(Transformation)、數據關聯(Join)、數據聚合(Aggregate)、時間窗口(TimeWindow)以及狀態(State)相關的API,我們可以使用這些預置的API來實現日常場景中大多數的需求。第4章會詳細介紹DataStream API預置的各類API的詳細使用方法。

2.有狀態流處理API

有狀態流處理API使用的編程語言和DataStream API是一樣的,不同之處在于實現用戶自定義函數時需要使用Flink為有狀態流處理API提供的ProcessFunction。

如代碼清單1-2所示,ProcessFunction和DataStream API進行了良好的集成,KeyedProcess-Function就是其中一種ProcessFunction。在實際開發Flink作業時,通常會混用DataStream API和有狀態流處理API,并不會刻意區分。

代碼清單1-2 有狀態流處理API案例

有狀態流處理API包含了DataStream API的所有功能。此外,在有狀態流處理API中使用ProcessFunction可以更加自由地控制時間。舉例來說,在DataStream API中,基于時間窗口的數據處理要么是事件時間語義,要么是處理時間語義,通常不會同時出現兩種時間語義。而在有狀態流處理API中,我們可以根據需求同時注冊事件時間、處理時間的定時器,并在觸發兩種時間的定時器時,通過回調函數處理數據,這樣可以幫助我們更靈活地處理數據。

1.3.2 關系型API

關系型API主要通過編寫類SQL代碼完成Flink作業的開發,Flink中的SQL API和Table API屬于此類。

1.Table API

我們可以使用Java、Python、Scala語言,通過Table API提供的關系型API開發一個Flink作業。如代碼清單1-3所示,Flink Table API內置了常見關系模型中的select、project、join、group-by和aggregate等處理數據的API。

代碼清單1-3 Table API案例

相比DataStream API來說,Table API有以下兩個明顯的優點。

?關系型API具備易用性、通用性:Table API是一種關系型API,或者說是一種類SQL的API,因此只要用戶對SQL有一定的了解,就很容易上手Table API。

?Table API屏蔽了Flink中狀態相關的復雜接口:屏蔽Flink底層的復雜原理可以幫助用戶專注于業務邏輯,降低開發和理解成本,這其實也是Flink在設計Table API和SQL API時的一個重要目標。

2.SQL API

和Table API類似,SQL API也基于關系模型,但是編程語言上使用了SQL語句,如代碼清單1-4所示。

代碼清單1-4 SQL API案例

SQL API遵循ANSI SQL標準,和MySQL、Hive SQL、Spark SQL的語法幾乎一致,因此SQL有的特點它都有,比如學習成本低、維護成本低,適合大面積推廣應用。

Flink還對SQL API、Table API與DataStream API之間進行了橋接,我們不但可以在SQL API和Table API之間無縫切換,還可以將SQL API、Table API處理的結果作為DataStream API的輸入,使用DataStream來定義復雜的數據處理邏輯。反之,也可以將DataStream API處理的結果作為SQL API、Table API的輸入,使用SQL API、Table API進行處理。

主站蜘蛛池模板: 荥阳市| 蒙阴县| 浏阳市| 涡阳县| 绥滨县| 罗江县| 商洛市| 巴林左旗| 茂名市| 子长县| 通榆县| 尤溪县| 朔州市| 漳平市| 青浦区| 原阳县| 贵港市| 岳普湖县| 朝阳市| 衡山县| 永春县| 平乡县| 天峻县| 桐柏县| 明溪县| 景泰县| 米林县| 宜都市| 广平县| 象州县| 扬中市| 宜良县| 惠州市| 阿拉善右旗| 穆棱市| 峨山| 剑川县| 肃宁县| 怀远县| 竹山县| 南充市|