02.24 Flink 新版發佈了什麼?

Apache Flink 是公認的新一代開源大數據計算引擎,可以支持流處理、批處理和機器學習等多種計算形態,也是Apache 軟件基金會和 GitHub 社區最為活躍的項目之一。

2019 年 1 月,阿里巴巴實時計算團隊宣佈將經過雙十一歷練和集團內部業務打磨的 Blink 引擎進行開源並向 Apache Flink 貢獻代碼,此後的一年中,阿里巴巴實時計算團隊與 Apache Flink 社區密切合作,持續推進 Flink 對 Blink 的整合。

2 月 12 日,Apache Flink 1.10.0 正式發佈,在 Flink 的第一個雙位數版本中正式完成了 Blink 向 Flink 的合併。在此基礎之上,Flink 1.10 版本在生產可用性、功能、性能上都有大幅提升。本文將詳細為大家介紹該版本的重大變更與新增特性。文末更有 Flink 實踐精選電子書,現已開放免費下載~

下載地址https://flink.apache.org/downloads.html

Flink 1.10 是迄今為止規模最大的一次版本升級,除標誌著 Blink 的合併完成外,還實現了 Flink 作業的整體性能及穩定性的顯著優化、對原生 Kubernetes 的初步集成以及對 Python 支持(PyFlink)的重大優化等。

綜述

Flink 1.10.0 版本一共有 218 名貢獻者,解決了 1270 個 JIRA issue,經由 2661 個 commit 總共提交了超過 102 萬行代碼,多項數據對比之前的幾個版本都有所提升,印證著 Flink 開源社區的蓬勃發展。

Flink 新版發佈了什麼?

Flink 新版發佈了什麼?

其中阿里巴巴實時計算團隊共提交 64.5 萬行代碼,超過總代碼量的 60%,做出了突出的貢獻。

Flink 新版發佈了什麼?

在該版本中,Flink 對 SQL 的 DDL 進行了增強,並實現了生產級別的 Batch 支持和 Hive 兼容,其中 TPC-DS 10T 的性能更是達到了 Hive 3.0 的 7 倍之多。在內核方面,對內存管理進行了優化。在生態方面,增加了 Python UDF 和原生 Kubernetes 集成的支持。後續章節將在這些方面分別進行詳細介紹。

內存管理優化

在舊版本的 Flink 中,流處理和批處理的內存配置是割裂的,並且當流式作業配置使用 RocksDB 存儲狀態數據時,很難限制其內存使用,從而在容器環境下經常出現內存超用被殺的情況。 在 1.10.0 中,我們對 Task Executor 的內存模型,尤其是受管理內存(Managed Memory)進行了大幅度的改進(FLIP-49),使得內存配置對用戶更加清晰:

Flink 新版發佈了什麼?

此外,我們還將 RocksDB state backend 使用的內存納入了託管範疇,同時可以通過簡單的配置來指定其能使用的內存上限和讀寫緩存比例(FLINK-7289)。如下圖所示,在實際測試當中受控前後的內存使用差別非常明顯。

Flink 新版發佈了什麼?


受控前的內存使用情況(share-slot)

Flink 新版發佈了什麼?


受控後的內存使用情況(share-slot)

Batch 兼容 Hive 且生產可用

Flink 從 1.9.0 版本開始支持 Hive 集成,但並未完全兼容。在 1.10.0 中我們對 Hive 兼容性做了進一步的增強,使其達到生產可用的標準。具體來說,Flink 1.10.0 中支持:

  • Meta 兼容 - 支持直接讀取 Hive catalog,覆蓋 Hive 1.x/2.x/3.x 全部版本
  • 數據格式兼容 - 支持直接讀取 Hive 表,同時也支持寫成 Hive 表的格式;支持分區表
  • UDF 兼容 - 支持在 Flink SQL 內直接調用 Hive 的 UDF,UDTF 和 UDAF

與此同時,1.10.0 版本中對 batch 執行進行了進一步的優化(FLINK-14133),主要包括:

  • 向量化讀取 ORC (FLINK-14135)
  • 基於比例的彈性內存分配 (FLIP-53)
  • Shuffle 的壓縮 (FLINK-14845)
  • 基於新調度框架的優化 (FLINK-14735)

在此基礎上將 Flink 作為計算引擎訪問 Hive 的 meta 和數據,在 TPC-DS 10T benchmark 下性能達到 Hive 3.0 的 7 倍以上。

Flink 新版發佈了什麼?

SQL DDL 增強

Flink 1.10.0 支持在 SQL 建表語句中定義 watermark 和計算列,以 watermark 為例:


<code>CREATE TABLEtable_name (   WATERMARK FOR columnName AS <watermark> ) WITH (   ... ) /<watermark>/<code>

除此之外,Flink 1.10.0 還在 SQL 中對臨時函數/永久函數以及系統/目錄函數進行了明確區分,並支持創建目錄函數、臨時函數以及臨時系統函數:

<code>CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF NOT EXISTS] [catalog_name.][db_name.]function_name AS identifier [LANGUAGE JAVA|SCALA] /<code>

Python UDF 支持

Flink 從 1.9.0 版本開始增加了對 Python 的支持(PyFlink),但用戶只能使用 Java 開發的 User-defined-function (UDF) ,具有一定的侷限性。在 1.10.0 中我們為 PyFlink 增加了原生 UDF 支持(FLIP-58),用戶現在可以在 Table API/SQL 中註冊並使用自定義函數,如下圖所示:

Flink 新版發佈了什麼?

同時也可以方便的通過 pip 安裝 PyFlink:

<code>pip install apache-flink /<code> 

更多詳細介紹,請參考:https://enjoyment.cool/2020/02/19/Deep-dive-how-to-support-Python-UDF-in-Apache-Flink-1-10/

原生 Kubernetes 集成

Kubernetes (K8S) 是目前最為流行的容器編排系統,也是目前最流行的容器化應用發佈平臺。在舊版本當中,想要在 K8S 上部署和管理一個 Flink 集群比較複雜,需要對容器、算子及 kubectl 等 K8S 命令有所瞭解。 在 Flink 1.10 中,我們推出了對 K8S 環境的原生支持(FLINK-9953),Flink 的資源管理器會主動和 Kubernetes 通信,按需申請 pod,從而可以在多租戶環境中以較少的資源開銷啟動 Flink,使用起來也更加的方便。

Flink 新版發佈了什麼?

更多內容,參考 1.10.0 版本發佈日誌:

https://ci.apache.org/projects/flink/flink-docs-stable/release-notes/flink-1.10.html

結語

2019 年 1 月,阿里巴巴實時計算團隊宣佈 Blink 開源。整整一年之後,Flink 1.10.0 版本的發佈宣告 Flink 和 Blink 的整合正式完成。我們踐行著自己的諾言,開放源碼,更相信社區的力量,相信社區是開源協作精神與創新的搖籃。我們也衷心希望有更多的志同道合的小夥伴加入我們,一起把 Apache Flink 做的越來越好!


分享到:


相關文章: