說明
- Flink Table 相關知識是我一直感興趣的部分,現決定跨過一些不必要的知識,直接學習 Flink Table ,本文主要介紹 flink table 架構和接口實現。
- Apache Flink 有兩種關係型 API 來做流批統一處理:Table API 和 SQL。Table API 是用於 Scala 和 Java 語言的查詢API,它可以用一種非常直觀的方式來組合使用選取、過濾、join 等關係型算子。Flink SQL 是基於 Apache Calcite 來實現的標準 SQL。這兩種 API 中的查詢對於批(DataSet)和流(DataStream)的輸入有相同的語義,也會產生同樣的計算結果。
資料
- 官方Flink 1.12中文版Table API&SQL文檔地址
架構
- 1.9版本Blink是阿里提供,Flink 1.12默認Blink實現Tabel API和SQL功能。
優勢
- 聲明式:用戶只關心做什麼,不用關心怎麼做。
- 高性能:支持查詢優化,可以獲得更好的執行性能。
- 流批統一:相同的統計邏輯,既可以流模式運行,也可以批模式運行。
- 標準穩定:語義遵循SQL標準,不易變動。
- 易理解:語義明確,所見即所得。
maven導包
tabel API和SQL
<!-- java -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
<!-- scala -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
本地環境配置
- 如果需要在 IDE 本地運行測試程序,需要添加以下模塊,具體用哪個取決使用哪個的引擎是 Flink 還是 Blink 。
<!-- flink引擎,1.9版本前默認 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
<!-- Blink 當前默認引擎 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
優化
stream支持scala
- 內部實現上,部分 table 相關代碼使用 Scala 開發。不管批式或流式程序,必須添加如下依賴。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
支持自定義格式或函數
- 如果需要實現自定義格式解析 Kafka 數據,或者自定義函數處理業務,需要添加如下依賴。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
程序結構
Blink(新)和flink(舊)計劃器區別
- Blink 將批處理作業視作流處理的一種特例。Table 和 DataSet 之間不支持相互轉換,並且批處理作業也不會轉換成 DataSet 程序而是轉換成 DataStream 程序,流處理作業也一樣。
- Blink 計劃器不支持 BatchTableSource,而是使用有界的 StreamTableSource 來替代。
- 舊計劃器和 Blink 計劃器中 FilterableTableSource 的實現是不兼容的。舊計劃器會將 PlannerExpression 下推至 FilterableTableSource,而 Blink 計劃器則是將 Expression 下推。
- 基於字符串的鍵值配置選項僅在 Blink 計劃器中使用。(詳情參見 配置 )
- PlannerConfig 在兩種計劃器中的實現(CalciteConfig)是不同的。
- Blink 計劃器會將多sink(multiple-sinks)優化成一張有向無環圖(DAG),TableEnvironment 和 StreamTableEnvironment 都支持該特性。舊計劃器總是將每個sink都優化成一個新的有向無環圖,且所有圖相互獨立。
- 舊計劃器目前不支持 catalog 統計數據,而 Blink 支持
程序結構
- 用於批處理和流處理的 Table API 和 SQL 程序都遵循相同的模式,先創建TableEnvironment,再創建表,繼續通過 Table API 或 SQL 操作表,實現業務功能,實例代碼如下:
// 創建一個TableEnvironment執行流或批處理
TableEnvironment tableEnv = ...;
// 創建輸入表
tableEnv.executeSql("CREATE TEMPORARY TABLE table1 ... WITH ( 'connector' = ... )");
// 創建輸出表
tableEnv.executeSql("CREATE TEMPORARY TABLE outputTable ... WITH ( 'connector' = ... )");
// 使用 Table API 執行查詢操作
Table table2 = tableEnv.from("table1").select(...);
// 使用 SQL 執行查詢操作
Table table3 = tableEnv.sqlQuery("SELECT ... FROM table1 ... ");
// 使用 Table API 獲取結果數據
TableResult tableResult = table2.executeInsert("outputTable");
tableResult...
總結
- Table 和 SQL 功能的加入,簡化了Flink開發難度,懂 Sql 就能開發自己需要的功能。
- 興趣是最好的老師,日常除了工作,維護好心底的熱情,工作和興趣分別對待,時刻保持活力。