102萬(wàn)行代碼,1270個(gè)問題,F(xiàn)link新版發(fā)布了什么?
阿里妹導(dǎo)讀:Apache Flink 是公認(rèn)的新一代開源大數(shù)據(jù)計(jì)算引擎,可以支持流處理、批處理和機(jī)器學(xué)習(xí)等多種計(jì)算形態(tài),也是Apache 軟件基金會(huì)和 GitHub 社區(qū)最為活躍的項(xiàng)目之一。
2019 年 1 月,阿里巴巴實(shí)時(shí)計(jì)算團(tuán)隊(duì)宣布將經(jīng)過雙十一歷練和集團(tuán)內(nèi)部業(yè)務(wù)打磨的 Blink 引擎進(jìn)行開源并向 Apache Flink 貢獻(xiàn)代碼,此后的一年中,阿里巴巴實(shí)時(shí)計(jì)算團(tuán)隊(duì)與 Apache Flink 社區(qū)密切合作,持續(xù)推進(jìn) Flink 對(duì) Blink 的整合。
2 月 12 日,Apache Flink 1.10.0 正式發(fā)布,在 Flink 的第一個(gè)雙位數(shù)版本中正式完成了 Blink 向 Flink 的合并。在此基礎(chǔ)之上,F(xiàn)link 1.10 版本在生產(chǎn)可用性、功能、性能上都有大幅提升。本文將詳細(xì)為大家介紹該版本的重大變更與新增特性。文末更有 Flink 實(shí)踐精選電子書,現(xiàn)已開放免費(fèi)下載~
下載地址:https://flink.apache.org/downloads.html
Flink 1.10 是迄今為止規(guī)模最大的一次版本升級(jí),除標(biāo)志著 Blink 的合并完成外,還實(shí)現(xiàn)了 Flink 作業(yè)的整體性能及穩(wěn)定性的顯著優(yōu)化、對(duì)原生 Kubernetes 的初步集成以及對(duì) Python 支持(PyFlink)的重大優(yōu)化等。
綜述
Flink 1.10.0 版本一共有 218 名貢獻(xiàn)者,解決了 1270 個(gè) JIRA issue,經(jīng)由 2661 個(gè) commit 總共提交了超過 102 萬(wàn)行代碼,多項(xiàng)數(shù)據(jù)對(duì)比之前的幾個(gè)版本都有所提升,印證著 Flink 開源社區(qū)的蓬勃發(fā)展。
其中阿里巴巴實(shí)時(shí)計(jì)算團(tuán)隊(duì)共提交 64.5 萬(wàn)行代碼,超過總代碼量的 60%,做出了突出的貢獻(xiàn)。
在該版本中,F(xiàn)link 對(duì) SQL 的 DDL 進(jìn)行了增強(qiáng),并實(shí)現(xiàn)了生產(chǎn)級(jí)別的 Batch 支持和 Hive 兼容,其中 TPC-DS 10T 的性能更是達(dá)到了 Hive 3.0 的 7 倍之多。在內(nèi)核方面,對(duì)內(nèi)存管理進(jìn)行了優(yōu)化。在生態(tài)方面,增加了 Python UDF 和原生 Kubernetes 集成的支持。后續(xù)章節(jié)將在這些方面分別進(jìn)行詳細(xì)介紹。
內(nèi)存管理優(yōu)化
在舊版本的 Flink 中,流處理和批處理的內(nèi)存配置是割裂的,并且當(dāng)流式作業(yè)配置使用 RocksDB 存儲(chǔ)狀態(tài)數(shù)據(jù)時(shí),很難限制其內(nèi)存使用,從而在容器環(huán)境下經(jīng)常出現(xiàn)內(nèi)存超用被殺的情況。 在 1.10.0 中,我們對(duì) Task Executor 的內(nèi)存模型,尤其是受管理內(nèi)存(Managed Memory)進(jìn)行了大幅度的改進(jìn)(FLIP-49),使得內(nèi)存配置對(duì)用戶更加清晰:
此外,我們還將 RocksDB state backend 使用的內(nèi)存納入了托管范疇,同時(shí)可以通過簡(jiǎn)單的配置來(lái)指定其能使用的內(nèi)存上限和讀寫緩存比例(FLINK-7289)。如下圖所示,在實(shí)際測(cè)試當(dāng)中受控前后的內(nèi)存使用差別非常明顯。
受控前的內(nèi)存使用情況(share-slot)
受控后的內(nèi)存使用情況(share-slot)
Batch 兼容 Hive 且生產(chǎn)可用
Flink 從 1.9.0 版本開始支持 Hive 集成,但并未完全兼容。在 1.10.0 中我們對(duì) Hive 兼容性做了進(jìn)一步的增強(qiáng),使其達(dá)到生產(chǎn)可用的標(biāo)準(zhǔn)。具體來(lái)說,F(xiàn)link 1.10.0 中支持:
- Meta 兼容 - 支持直接讀取 Hive catalog,覆蓋 Hive 1.x/2.x/3.x 全部版本
- 數(shù)據(jù)格式兼容 - 支持直接讀取 Hive 表,同時(shí)也支持寫成 Hive 表的格式;支持分區(qū)表
- UDF 兼容 - 支持在 Flink SQL 內(nèi)直接調(diào)用 Hive 的 UDF,UDTF 和 UDAF
與此同時(shí),1.10.0 版本中對(duì) batch 執(zhí)行進(jìn)行了進(jìn)一步的優(yōu)化(FLINK-14133),主要包括:
- 向量化讀取 ORC (FLINK-14135)
- 基于比例的彈性內(nèi)存分配 (FLIP-53)
- Shuffle 的壓縮 (FLINK-14845)
- 基于新調(diào)度框架的優(yōu)化 (FLINK-14735)
在此基礎(chǔ)上將 Flink 作為計(jì)算引擎訪問 Hive 的 meta 和數(shù)據(jù),在 TPC-DS 10T benchmark 下性能達(dá)到 Hive 3.0 的 7 倍以上。
SQL DDL 增強(qiáng)
Flink 1.10.0 支持在 SQL 建表語(yǔ)句中定義 watermark 和計(jì)算列,以 watermark 為例:
- CREATE TABLEtable_name (
- WATERMARK FOR columnName AS <watermark_strategy_expression>
- ) WITH (
- ...
- )
除此之外,F(xiàn)link 1.10.0 還在 SQL 中對(duì)臨時(shí)函數(shù)/永久函數(shù)以及系統(tǒng)/目錄函數(shù)進(jìn)行了明確區(qū)分,并支持創(chuàng)建目錄函數(shù)、臨時(shí)函數(shù)以及臨時(shí)系統(tǒng)函數(shù):
- CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION
- [IF NOT EXISTS] [catalog_name.][db_name.]function_name
- AS identifier [LANGUAGE JAVA|SCALA]
Python UDF 支持
Flink 從 1.9.0 版本開始增加了對(duì) Python 的支持(PyFlink),但用戶只能使用 Java 開發(fā)的 User-defined-function (UDF) ,具有一定的局限性。在 1.10.0 中我們?yōu)?PyFlink 增加了原生 UDF 支持(FLIP-58),用戶現(xiàn)在可以在 Table API/SQL 中注冊(cè)并使用自定義函數(shù),如下圖所示:
同時(shí)也可以方便的通過 pip 安裝 PyFlink:
- pip install apache-flink
更多詳細(xì)介紹,請(qǐng)參考:https://enjoyment.cool/2020/02/19/Deep-dive-how-to-support-Python-UDF-in-Apache-Flink-1-10/
原生 Kubernetes 集成
Kubernetes (K8S) 是目前最為流行的容器編排系統(tǒng),也是目前最流行的容器化應(yīng)用發(fā)布平臺(tái)。在舊版本當(dāng)中,想要在 K8S 上部署和管理一個(gè) Flink 集群比較復(fù)雜,需要對(duì)容器、算子及 kubectl 等 K8S 命令有所了解。 在 Flink 1.10 中,我們推出了對(duì) K8S 環(huán)境的原生支持(FLINK-9953),F(xiàn)link 的資源管理器會(huì)主動(dòng)和 Kubernetes 通信,按需申請(qǐng) pod,從而可以在多租戶環(huán)境中以較少的資源開銷啟動(dòng) Flink,使用起來(lái)也更加的方便。
更多內(nèi)容,參考 1.10.0 版本發(fā)布日志:
https://ci.apache.org/projects/flink/flink-docs-stable/release-notes/flink-1.10.html
結(jié)語(yǔ)
2019 年 1 月,阿里巴巴實(shí)時(shí)計(jì)算團(tuán)隊(duì)宣布 Blink 開源。整整一年之后,F(xiàn)link 1.10.0 版本的發(fā)布宣告 Flink 和 Blink 的整合正式完成。我們踐行著自己的諾言,開放源碼,更相信社區(qū)的力量,相信社區(qū)是開源協(xié)作精神與創(chuàng)新的搖籃。我們也衷心希望有更多的志同道合的小伙伴加入我們,一起把 Apache Flink 做的越來(lái)越好!