flink(九):Table&Sql環境搭建和程序結構

說明

  • 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)的輸入有相同的語義,也會產生同樣的計算結果。

資料

架構

  • 1.9版本Blink是阿里提供,Flink 1.12默認Blink實現Tabel API和SQL功能。

優勢

  • 聲明式:用戶只關心做什麼,不用關心怎麼做。
  • 高性能:支持查詢優化,可以獲得更好的執行性能。
  • 流批統一:相同的統計邏輯,既可以流模式運行,也可以批模式運行。
  • 標準穩定:語義遵循SQL標準,不易變動。
  • 易理解:語義明確,所見即所得。

maven導包

tabel API和SQL

  • 針對java和scala語言導入不同包。
<!-- 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(舊)計劃器區別

  1. Blink 將批處理作業視作流處理的一種特例。Table 和 DataSet 之間不支持相互轉換,並且批處理作業也不會轉換成 DataSet 程序而是轉換成 DataStream 程序,流處理作業也一樣。
  2. Blink 計劃器不支持 BatchTableSource,而是使用有界的 StreamTableSource 來替代。
  3. 舊計劃器和 Blink 計劃器中 FilterableTableSource 的實現是不兼容的。舊計劃器會將 PlannerExpression 下推至 FilterableTableSource,而 Blink 計劃器則是將 Expression 下推。
  4. 基於字符串的鍵值配置選項僅在 Blink 計劃器中使用。(詳情參見 配置 )
  5. PlannerConfig 在兩種計劃器中的實現(CalciteConfig)是不同的。
  6. Blink 計劃器會將多sink(multiple-sinks)優化成一張有向無環圖(DAG),TableEnvironment 和 StreamTableEnvironment 都支持該特性。舊計劃器總是將每個sink都優化成一個新的有向無環圖,且所有圖相互獨立。
  7. 舊計劃器目前不支持 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 就能開發自己需要的功能。
  • 興趣是最好的老師,日常除了工作,維護好心底的熱情,工作和興趣分別對待,時刻保持活力。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章