Flink學習之路(十)—— Table API 和 Flink SQL (一)—— 整體介紹
阿新 • • 發佈:2021-01-18
什麼是 Table API 和 Flink SQL
Flink 本身是批流統一的處理框架,所以 Table API 和 SQL,就是批流統一的上層處理 API。
目前功能尚未完善,處於活躍的開發階段。
Table API 是一套內嵌在 Java 和 Scala 語言中的查詢 API,它允許我們以非常直觀的方式,
組合來自一些關係運算符的查詢(比如 select、filter 和 join)。而對於 Flink SQL,就是直接可
以在程式碼中寫 SQL,來實現一些查詢(Query)操作。Flink 的 SQL 支援,基於實現了 SQL 標
準的 Apache Calcite(Apache 開源 SQL 解析工具)。
到相同的結果。
需要引入的依賴
Table API 和 SQL 需要引入的依賴有兩個:planner 和 bridge。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.10.1</version>
</dependency> <dependency >
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.12</artifactId>
<version>1.10.1</version>
</dependency>
flink-table-planner:planner 計劃器,是 table API 最主要的部分,提供了執行時環境和生成程式執行計劃的 planner;
flink-table-api-java-bridge:bridge 橋接器,主要負責 table API 和 DataStream/DataSet API的連線支援,按照語言分 java 和 scala。
這裡的兩個依賴,是 IDE 環境下執行需要新增的;如果是生產環境,lib 目錄下預設已經有了 planner,就只需要有 bridge 就可以了。
當然,如果想使用使用者自定義函式,或是跟 kafka 做連線,需要有一個 SQL client,這個包含在 flink-table-common 裡。
兩種 planner(old & blink)的區別
- 批流統一:Blink 將批處理作業,視為流式處理的特殊情況。所以,blink 不支援表和
DataSet 之間的轉換,批處理作業將不轉換為 DataSet 應用程式,而是跟流處理一樣,轉換
為 DataStream 程式來處理。 - 因 為 批 流 統 一 , Blink planner 也 不 支 持 BatchTableSource , 而 使 用 有 界 的
StreamTableSource 代替。 - Blink planner 只支援全新的目錄,不支援已棄用的 ExternalCatalog。
- 舊 planner 和 Blink planner 的 FilterableTableSource 實現不相容。舊的 planner 會把
PlannerExpressions 下推到 filterableTableSource 中,而 blink planner 則會把 Expressions 下推。 - 基於字串的鍵值配置選項僅適用於 Blink planner。
- PlannerConfig 在兩個 planner 中的實現不同。
- Blink planner 會將多個 sink 優化在一個 DAG 中(僅在 TableEnvironment 上受支援,而
在 StreamTableEnvironment 上不受支援)。而舊 planner 的優化總是將每一個 sink 放在一個新
的 DAG 中,其中所有 DAG 彼此獨立。 - 舊的 planner 不支援目錄統計,而 Blink planner 支援。
END