8月22日,Apache Flink 1.9.0 版本正式發佈,這也是阿里內部版本 Blink 合併入 Flink 後的首次版本發佈。這次版本更新帶來的重大功能包括批處理做業的批式恢復,以及 Table API 和 SQL 的基於 Blink 的新查詢引擎(預覽版)。同時,這一版本還推出了 State Processor API,這是社區最迫切需求的功能之一,該 API 使用戶可以用 Flink DataSet 做業靈活地讀寫保存點。此外,Flink 1.9 還包括一個從新設計的 WebUI 和新的 Python Table API (預覽版)以及與 Apache Hive 生態系統的集成(預覽版)。html
Apache Flink 項目的目標是開發一個流式處理系統,以統一和支持多種形式的實時和離線數據處理應用程序以及事件驅動的應用程序。在此版本中,咱們在這方面取得了巨大的進步,將 Flink 的流處理和批處理能力集成在了統一的運行時之上。python
本文將描述全部主要的新功能、改進、重要變化、以及將來的發展計劃。有關更多詳細信息,請查看完整版變動日誌。數據庫
Flink 1.9 版本的二進制分發和源文件能夠經過 Flink 項目的下載頁面以及文檔頁面得到。 Flink 1.9 與以前 1.x 版本的@Public
API 是兼容的。apache
你也能夠經過 Flink 郵件列表 或 JIRA 與社區分享你的想法。api
新功能和改進網絡
批做業(DataSet、Table API 和 SQL)從 task 失敗中恢復的時間被顯著縮短了。在 Flink 1.9 以前,批處理做業中的 task 失敗是經過取消全部 task 並從新啓動整個做業來恢復的,即做業從頭開始,全部進度都會廢棄。在此版本中,Flink 將中間結果保留在網絡 shuffle 的邊緣,並使用此數據去恢復那些僅受故障影響的 task。所謂 task 的 「failover regions」 (故障區)是指經過 pipelined 方式鏈接的數據交換方式,定義了 task 受故障影響的邊界。有關更多詳細信息,請參見 FLIP-1。機器學習
要使用這個新的故障策略,須要確保 flink-conf.yaml
中有 jobmanager.execution.failover-strategy: region
的配置。函數
注意:1.9 發佈包中默認就已經包含了該配置項,不過當從以前版本升級上來時,若是要複用以前的配置的話,須要手動加上該配置。oop
「Region」 的故障策略也能同時提高 「embarrassingly parallel」 類型的流做業的恢復速度,也就是沒有任何像 keyBy() 和 rebalance 的 shuffle 的做業。當這種做業在恢復時,只有受影響的故障區的 task 須要重啓。對於其餘類型的流做業,故障恢復行爲與以前的版本同樣。性能
直到 Flink 1.9,從外部訪問做業的狀態僅侷限於:Queryable State(可查詢狀態)實驗性功能。此版本中引入了一種新的、強大的類庫,基於 DataSet 支持讀取、寫入、和修改狀態快照。在實踐上,這意味着:
新的 State Processor API 覆蓋了全部類型的快照:savepoint,full checkpoint 和 incremental checkpoint。有關更多詳細信息,請參見 FLIP-43。
"Cancel-with-savepoint" 是中止、重啓、fork、或升級 Flink 做業的一個經常使用操做。然而,當前的實現並無保證輸出到 exactly-once sink 的外部存儲的數據持久化。爲了改進中止做業時的端到端語義,Flink 1.9 引入了一種新的 SUSPEND
模式,能夠帶 savepoint 中止做業,保證了輸出數據的一致性。你可使用 Flink CLI 來 suspend 一個做業:
bin/flink stop -p [:targetSavepointDirectory] :jobId
最終做業的狀態會在成功時設置成 FINISHED
狀態,方便用戶區別操做是否失敗了。
更多詳細信息,請參見 FLIP-34。
社區討論了現代化 Flink WebUI 的提案,決定採用 Angular 的最新穩定版來重構這個組件。從 Angular 1.x 躍升到了 7.x 。從新設計的 UI 是 1.9.0 的默認版本,不過有一個按鈕能夠切換到舊版的 WebUI。
注:將來,咱們不保證舊版 WebUI 的功能是對齊的,且待新版本穩定後將會徹底移除舊版 WebUI。
在 Blink 捐贈給 Apache Flink 以後,社區就致力於爲 Table API 和 SQL 集成 Blink 的查詢優化器和 runtime。第一步,咱們將 flink-table
單模塊重構成了多個小模塊(FLIP-32)。這對於 Java 和 Scala API 模塊、優化器、以及 runtime 模塊來講,有了一個更清晰的分層和定義明確的接口。
緊接着,咱們擴展了 Blink 的 planner 以實現新的優化器接口,因此如今有兩個插件化的查詢處理器來執行 Table API 和 SQL:1.9 之前的 Flink 處理器和新的基於 Blink 的處理器。基於 Blink 的查詢處理器提供了更好地 SQL 覆蓋率(1.9 完整支持 TPC-H,TPC-DS 的支持在下一個版本的計劃中)並經過更普遍的查詢優化(基於成本的執行計劃選擇和更多的優化規則)、改進的代碼生成機制、和調優過的算子實現來提高批處理查詢的性能。除此以外,基於 Blink 的查詢處理器還提供了更強大的流處理能力,包括一些社區期待已久的新功能(如維表 Join,TopN,去重)和聚合場景緩解數據傾斜的優化,以及內置更多經常使用的函數。
注:兩個查詢處理器之間的語義和功能大部分是一致的,但並未徹底對齊。具體請查看發佈日誌。
不過, Blink 的查詢處理器的集成尚未徹底完成。所以,1.9 以前的 Flink 處理器仍然是1.9 版本的默認處理器,建議用於生產設置。你能夠在建立 TableEnvironment
時經過 EnvironmentSettings
配置啓用 Blink 處理器。被選擇的處理器必需要在正在執行的 Java 進程的類路徑中。對於集羣設置,默認兩個查詢處理器都會自動地加載到類路徑中。當從 IDE 中運行一個查詢時,須要在項目中顯式地增長一個處理器的依賴。
除了圍繞 Blink Planner 使人興奮的進展外,社區還作了一系列的改進,包括:
做爲重構和拆分 flink-table 模塊工做的一部分,咱們爲 Java 和 Scala 建立了兩個單獨的 API 模塊。對於 Scala 用戶來講,沒有什麼改變。不過如今 Java 用戶在使用 Table API 和 SQL 時,能夠不用引入一堆 Scala 依賴了。
咱們實現了一個新的數據類型系統,以便從 Table API 中移除對 Flink TypeInformation 的依賴,並提升其對 SQL 標準的聽從性。不過還在進行中,預計將在下一版本完工,在 Flink 1.9 中,UDF 還沒有移植到新的類型系統上。
Table API 擴展了一組支持多行和多列、輸入和輸出的轉換的功能。這些轉換顯著簡化了處理邏輯的實現,一樣的邏輯使用關係運算符來實現是比較麻煩的。
Catalog 已有的一些接口被重構和(某些)被替換了,從而統一了內部和外部 catalog 的處理。這項工做主要是爲了 Hive 集成(見下文)而啓動的,不過也改進了 Flink 在管理 catalog 元數據的總體便利性。
到目前爲止,Flink SQL 已經支持 DML 語句(如 SELECT
,INSERT
)。可是外部表(table source 和 table sink)必須經過 Java/Scala 代碼的方式或配置文件的方式註冊。1.9 版本中,咱們支持 SQL DDL 語句的方式註冊和刪除表(CREATE TABLE
,DROP TABLE
)。然而,咱們尚未增長流特定的語法擴展來定義時間戳抽取和 watermark 生成策略等。流式的需求將會在下一版本完整支持。
Apache Hive 是 Hadoop 生態圈中普遍用於存儲和查詢海量結構化數據的系統。Hive 除了是一個查詢處理器外,還提供了一個叫作 Metastore 的 catalog 來管理和組織大數據集。查詢處理器的一個常見集成點是與 Hive 的 Metastore 集成,以便可以利用 Hive 管理的數據。
最近,社區開始爲 Flink Table API 和 SQL 實現一個鏈接到 Hive Metastore 的外部 catalog。在 Flink 1.9 中,用戶可以查詢和處理存儲在 Hive 中多種格式的數據。 Hive 集成還包括支持在 Flink Table API / SQL 中使用 Hive 的 UDF。有關詳細信息,請參見 FLINK-10556。
在之前,Table API / SQL 中定義的表一直是臨時的。不過,新的 catalog 鏈接器還容許在 Metastore 中持久化存儲那些使用 SQL DDL 語句建立的表(參見上文)。這意味着你能夠鏈接到 Metastore 並註冊一個表,例如,是一個 Kafka topic 的表。從如今開始,只要 catalog 鏈接到 Metastore,就能夠查詢該表。
請注意 Flink 1.9 中提供的 Hive 支持仍是實驗性的。咱們計劃在下一個版本中穩定這些功能,並期待你的反饋。
此版本還引入了 Python Table API 的第一個版本(FLIP-38)。 這標誌着咱們爲 Flink 帶來完善 Python 支持的目標的開始。該功能圍繞着 Table API 設計了很薄的一層 Python API 包裝器,基本上將 Python Table API 方法的調用都轉換爲 Java Table API 調用。在 Flink 1.9 版本中,Python Table API 尚不支持UDF,只是標準的關係操做。Python 中支持UDF 的功能在將來版本的路線圖中。
若是你想嘗試新的 Python API,則須要手動安裝 PyFlink。而後,能夠看一看文檔中的演練並嘗試本身探索。社區目前正在準備一個 pyflink
的 Python 包,該包將能夠經過 pip
進行安裝。
./opt
移動到 ./lib
來啓用 Table API 和 SQL。flink-ml
)已經被移除了,
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。