0、展望---Flink 1.9版本變化及新特性

一、背景及概覽

阿里內部版本Blink首次合併入Flink,並於2019年8月22日,正式發佈Apache Flink 1.9.0 版本。
Flink1.9版本變化官方文檔

  • 更新概述:
    1. 架構升級
    2. 新功能和改進
      1. 細粒度批作業恢復 (FLIP-1)
      2. State Processor API (FLIP-43)
      3. Stop-with-Savepoint (FLIP-34)
      4. 新 Blink SQL 查詢處理器預覽
      5. Table API / SQL 的改進
      6. 重構 Flink WebUI
      7. Hive 集成預覽 (FLINK-10556)
      8. 新 Python Table API 預覽 (FLIP-38)
    3. 重要變化
      1. Flink 發行版默認配置Table API 和 SQL
      2. 移除機器學習類庫(flink-ml)
      3. 刪除舊的DataSet 和 DataStream python API
      4. 支持java9(外部系統進行交互的部分組件(connectors,文件系統,reporters)暫不支持java9)

二、架構升級

新版Flink1.9在流批融合的方向上邁進了一大步。

舊版架構:

舊版Flink架構

  1. 舊版處理方式:舊版Flink在其分佈式流式執行引擎之上,有兩套相對獨立的DataStream 和 DataSet API,分別來描述流計算和批處理的作業。在這兩個API之上,則提供了一個流批統一的API,即 Table API 和 SQL。用戶可以使用相同的Table API 程序或者 SQL 來描述流批作業(在運行時需要告訴Flink引擎希望以流的形式運行還是以批的形式運行),此時 Table 層的優化器就會將程序優化成 DataStream 作業或者DataSet 作業。上圖右半部分是DataStream 和 DataSet 底層的實現細節,其實兩者共享的模塊很少,它們有各自獨立的翻譯和優化的流程,而且在真正運行的時候,兩者也使用了完全不同的Task。這樣的不一致對用戶和開發者來講可能存在問題。
  2. 舊版存在的問題:由於DataStream和DataSet這兩個API不僅語義不同,同時支持的 connector 種類也不同,在開發者編寫作業的時候當需要在兩套 API 之間進行選擇時,會造成一些困擾,難以做到代碼的複用(我們在開發一些新功能的時候,往往需要將類似的功能開發兩次,並且每種 API 的開發路徑都比較長,基本都屬於端到端的修改,這大大降低了我們的開發效率)。Table 儘管在 API 上已經進行了統一,但因爲底層實現還是基於 DataStream 和 DataSet,也會受到剛纔不一致的問題的影響。

新版架構:

新版Flink架構
在新版架構中,Flink將捨棄DataSet API,用戶的API主要會分爲偏描述物理執行計劃
的 DataStream API 以及偏描述關係型計劃的 Table & SQL。

  1. DataStream API:用戶自行描述和編排算子的關係,引擎不會做過多的干涉和優化。
  2. Table API & SQL:繼續保舊版本在的風格,提供關係表達式API,引擎會根據用戶的意圖來進行優化,並選擇最優的執行計劃。
  3. 流批一體:以後這兩個 API 都會各自同時提供流計算和批處理的功能。這兩個用戶API之下,在實現層它們都會共享相同的技術棧,比如會用統一的 DAG 數據結構來描述作業,使用統一的StreamOperator來編寫算子邏輯,包括使用統一的流式分佈式執行引擎。

三、新功能和改進

1. 細粒度批作業恢復 (FLIP-1)

  • 上圖:
    作業恢復
  • 批作業恢復是什麼: 當批作業(DataSet、Table API 和SQL)中的某個task失敗後,需要對其進行恢復的故障策略。
  • 舊版本處理方式:在Flink1.9之前是通過取消所有task並重新啓動整個作業來恢復,也就之前已運行是所有的進度都會廢棄。
  • 新版本處理方式:在1.9版本中Flink會將中間結果保留在網絡shuffle的邊緣,然後使用這些數據來恢復失敗的tasks(處在同一個 failover region (故障區)的 tasks)。故障區:指通過pipelined 數據交換方式(Flink在網絡傳輸層上的一種傳輸方式,即一條數據處理完立刻傳輸給下一個節點處理)連接的 tasks 集合,因此作業中 batch-shuffle 的連接定義了故障區的邊界。
  • 怎麼使用:首先需要確保flink-conf.yaml 中有jobmanager.execution.failoverstrategy: region 的配置(Flink1.9 發佈包默認已經包含,當從低版本升級過來時,需要手動加上該配置);其次還需要在 ExecutionConfig 中,將 ExecutionMode 設置成 BATCH,這樣批作業纔能有多個故障區。
  • “Region” 的故障策略也能同時提升 “embarrassingly parallel” 類型的流作業恢復速度,也就
    是不包含任何像 keyBy、rebalance 等 shuffle 的作業。當這種作業在恢復時,只有受影響的故障
    區 task 需要重啓。對於其他類型的流作業,故障恢復行爲與之前的版本一樣。

2. State Processor API (FLIP-43)

  • 爲什麼引入狀態處理API:舊版本當我們從外部訪問作業的狀態時僅侷限於:Queryable State(可查詢狀態)實驗性功能,1.9新版本中引入了State Processor API這一種強大類庫,基於 DataSet 支持讀取、寫入、和修改狀態快照(支持所有類型的快照:savepoint,full checkpoint 和 incremental checkpoint)。
  • 在實踐中有什麼用:
    1. Flink作業的狀態可以自主構建,通過讀取外部系統的數據(例如外部數據庫),轉換成savepoint。
    2. 在進行應用程序審覈或故障排查時可以使用任意的 Flink 批處理 API 查詢(DataSet、Table、SQL)Savepoint 中的狀態。
    3. 支持離線遷移Savepoint 中的狀態 schema(舊版本只能在訪問狀態時進行,屬於在線遷移)。
    4. 可以識別並糾正Savepoint 中的無效數據。

3. Stop-with-Savepoint (FLIP-34)

  • 爲什麼引入Stop-with-Savepoint:在1.9版本之前已經有了"Cancel-with-savepoint",是停止、重啓、fork、或升級 Flink 作業的一個常用操作。但是這個cancel的實現沒有保證輸出到exactly-once sink 的外部存儲的數據持久化,爲了改進當停止作業時的端到端語義,Flink 1.9 引入了一種新的 SUSPEND 模式,可以帶 savepoint 停止作業,保證了輸出
    數據的一致性。
    使用 Flink CLI 來 suspend 一個作業
    bin/flink stop -p [:targetSavepointDirectory] :jobId
    

4. 新 Blink SQL 查詢處理器預覽

  • 上圖:
    Query Processor
  • 產生背景:由於Blink的Table模塊已經使用了Flink的新版架構,爲了儘量不影響之前版本用戶的體驗,需要找到一個方法讓兩種架構能夠並存。
  • 如何實現:首先將 flink-table 單模塊重構成了多個小模塊(對於 Java
    和 Scala API 模塊、優化器、以及 runtime 模塊來說,有了一個更清晰的分層和定義明確的接口);然後提出了 Planner 接口以支持多種不同的Planner實現(擴展了 Blink 的planner以實現新的優化器接口,所以現在有兩個插件化的查詢處理器來執行 Table API 和 SQL),Planner將負責具體的優化和將Table作業翻譯成執行圖的工作,我們可以將舊版本的實現全部挪至 Flink Planner中,然後把對接新架構的代碼放在 Blink Planner 裏。
  • 支持情況:1.9 以前的 Flink 處理器和新的基於 Blink 的處理器。基於 Blink
    的查詢處理器提供了更好地 SQL 覆蓋率(1.9 完整支持 TPC-H,TPC-DS 的支持計劃在下一個版本實現)並通過更廣泛的查詢優化(基於成本的執行計劃選擇和更多的優化規則)、改進的代碼生成機制、和調優過的算子實現來提升批處理查詢的性能。
  • 還支持更強大的流處理能力:新功能(如維表Join,TopN,去重)和聚合場景緩解數據傾斜的優化,以及內置更多常用的函數。
  • Blink Query Processor:
    Blink Query Processor
  • 注意:Blink 的查詢處理器尚未完全集成。因此,1.9 之前的 Flink處理器仍然是 1.9版本的默認處理器,建議用於生產設置。可以在創建TableEnvironment時通過EnvironmentSettings配置啓用Blink處理器。被選擇的處理器必須要在正在執行的 Java進程的類路徑中。對於集羣設置,默認兩個查詢處理器都會自動地加載到類路徑中。當從 IDE中運行一個查詢時,需要在項目中顯式地 增加一個處理器的依賴。

5. Table API / SQL 的其它改進

  • 爲 Table API / SQL 的 Java 用戶去除 Scala 依賴 (FLIP-32)
    由於新版本對flink-table模塊進行了重構和拆分,因此Flink1.9爲Java和Scala創建了兩個單獨的API模塊。在使用Table API 和 SQL時,java用戶不需要再額外引用一堆Scala依賴了。
  • 重構 Table API / SQL 的類型系統(FLIP-37)
    爲了從 Table API 中移除對 Flink TypeInformation 的依賴,並提高其對SQL標準的遵從性,Flink 1.9 實現了一個新的數據類型系統。不過這個新的數據系統還在還在實現中,預計將在下一版本完工,並且在 Flink 1.9中,UDF 尚未移植到新的類型系統上。
  • Table API 的多行多列轉換(FLIP-29)
    Table API 擴展了一組能夠支持多行和多列、輸入和輸出的轉換功能。極大的簡化了處理邏輯的實現,同樣的邏輯如果使用舊版本的關係運算符來實現就會相對麻煩。
  • 新的統一的 Catalog API
    爲了Hive集成,Flink開發出了嶄新的 Catalog 接口以統一處理內外部的 catalog 及元數據。在集成了Hive的同時也全面提升了Flink在管理catalog元數據的整體便利性,比如在舊版本中通過 Table API 或 SQL 定義的表都無法持久化保存,而在Flink1.9新版本中,這些表的元數據可以被持久化到 catalog 中。這意味着用戶可以在 Hive Metastore Catalog 中創建 Kafka
    表,並在 query 中直接引用該表。
  • SQL API 中的 DDL 支持 (FLINK-10232)
    在舊版本中Flink SQL 已經支持 DML 語句(如 SELECT,INSERT)。但是外部表(table source 和 table sink)必須通過 Java/Scala 代碼或配置文件的方式註冊。1.9 版本中,支持 SQL DDL 語句的方式註冊和刪除表(CREATE TABLE,DROP TABLE)。不過目前還沒有增加流特定的語法擴展來定義時間戳抽取和 watermark 生成策略等。流式的需求也將會在下一版本中完整支持。

6. 重構 Flink WebUI

新版Flink的WebUI基於Angular 的最新穩定版進行了重構,舊版本到新版本分別從 Angular 1.x 躍升到了 7.x。在新版依然保留舊版的UI,但未來會完全移除舊版WebUI

7. Hive 集成預覽 (FLINK-10556)

  • Hive Metastore : Hive作爲hadoop生態圈裏廣泛用於存儲和查詢海量結構化數據的系統,除了作爲查詢處理器外,還提供了一個叫做Metastore 的 catalog來管理和組織大數據集。當與 Hive 的 Metastore 集成後,便能夠利用 Hive 管理的數據。
  • 新版本爲 Flink Table API 和 SQL 實現一個連接到 Hive Metastore 的外部 catalog,在Flink 1.9 中,用戶能夠查詢和處理存儲在 Hive 中多種格式的數據,並且還可以使用Hive的UDF。
  • 舊版本里的Table API / SQL 中定義的表一直是臨時的,在新版本中,新的 catalog 連接器允許在 Metastore 中持久化存儲那些使用 SQL DDL 語句創建的表。因此,可以直接連接到 Metastore並註冊一個表,例如,Kafka topic 的表。從現在開始,只要 catalog 連接到 Metastore,就可以查詢該表。
  • 注意:新版本提供的Hive支持還處於實驗性質,在下個版本中會穩定這些功能。

8. 新 Python Table API 預覽 (FLIP-38)

  • 怎麼實現的:Flink將持續完善對Python的支持作爲自己的目標,在Flink1.9版本引入了 Python Table API 的首個版本,該版本圍繞着 Table API 設計了很薄的一層 Python API包裝器,基本上將 Python Table API方法的調用都轉換爲 Java Table API 調用。
  • 支持情況:Python Table API 尚不支持 UDF,只是標準的關係操作,後續會進行規劃。
  • 如何使用:需要手動安裝PyFlink,然後才能使用。

四、重要變化

  1. Table API 和 SQL 現在是 Flink 發行版的默認配置的一部分。以前,必須通過將相應的 JAR 文件從 ./opt 移動到 ./lib 來啓用 Table API 和 SQL。
  2. 爲了準備 FLIP-39,機器學習類庫(flink-ml)已經被移除了。
  3. 舊的 DataSet 和 DataStream Python API 已被刪除,建議使用 FLIP-38 中引入的新 Python API。
  4. Flink1.9 支持java9進行編譯和運行。請注意,與外部系統(connectors,文件系統,reporters)交互的某些組件可能無法工作,目前相應的項目可能不支持 Java 9。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章