Apache Flink 社區(qū)迎來了激動(dòng)人心的兩位數(shù)位版本號(hào),F(xiàn)link 1.10.0 正式宣告發(fā)布叉谜!作為 Flink 社區(qū)迄今為止規(guī)模最大的一次版本升級(jí)旗吁,F(xiàn)link 1.10 容納了超過 200 位貢獻(xiàn)者對(duì)超過 1200 個(gè) issue 的開發(fā)實(shí)現(xiàn),包含對(duì) Flink 作業(yè)的整體性能及穩(wěn)定性的顯著優(yōu)化停局、對(duì)原生 Kubernetes 的初步集成以及對(duì) Python 支持(PyFlink)的重大優(yōu)化很钓。
Flink 1.10 同時(shí)還標(biāo)志著對(duì) Blink[1] 的整合宣告完成,隨著對(duì) Hive 的生產(chǎn)級(jí)別集成及對(duì) TPC-DS 的全面覆蓋董栽,F(xiàn)link 在增強(qiáng)流式 SQL 處理能力的同時(shí)也具備了成熟的批處理能力码倦。本篇博客將對(duì)此次版本升級(jí)中的主要新特性及優(yōu)化、值得注意的重要變化以及使用新版本的預(yù)期效果逐一進(jìn)行介紹锭碳。
官網(wǎng)下載鏈接:
https://flink.apache.org/downloads.html
新版本的二進(jìn)制發(fā)布包和源碼包已經(jīng)可以在最新的 Flink 官網(wǎng)下載頁面 [2] 找到袁稽。更多細(xì)節(jié)請(qǐng)參考完整的版本更新日志 [3] 以及最新的用戶文檔 [4]。歡迎您下載試用此版本工禾,并將您的反饋意見通過 Flink 郵件列表 [5] 或 JIRA[6] 與社區(qū)分享运提。
新特性及優(yōu)化
內(nèi)存管理及配置優(yōu)化
Flink 目前的 TaskExecutor 內(nèi)存模型存在著一些缺陷,導(dǎo)致優(yōu)化資源利用率比較困難闻葵,例如:
流和批處理內(nèi)存占用的配置模型不同民泵;流處理中的 RocksDB state backend 需要依賴用戶進(jìn)行復(fù)雜的配置。為了讓內(nèi)存配置變的對(duì)于用戶更加清晰槽畔、直觀栈妆,F(xiàn)link 1.10 對(duì) TaskExecutor 的內(nèi)存模型和配置邏輯進(jìn)行了較大的改動(dòng) (FLIP-49 [7])。這些改動(dòng)使得 Flink 能夠更好地適配所有部署環(huán)境(例如 Kubernetes, Yarn, Mesos),讓用戶能夠更加嚴(yán)格的控制其內(nèi)存開銷鳞尔。
■?Managed 內(nèi)存擴(kuò)展
Managed 內(nèi)存的范圍有所擴(kuò)展嬉橙,還涵蓋了 RocksDB state backend 使用的內(nèi)存。盡管批處理作業(yè)既可以使用堆內(nèi)內(nèi)存也可以使用堆外內(nèi)存寥假,使用 RocksDB state backend 的流處理作業(yè)卻只能利用堆外內(nèi)存市框。因此為了讓用戶執(zhí)行流和批處理作業(yè)時(shí)無需更改集群的配置,我們規(guī)定從現(xiàn)在起 managed 內(nèi)存只能在堆外糕韧。
■?簡(jiǎn)化 RocksDB 配置
此前枫振,配置像 RocksDB 這樣的堆外 state backend 需要進(jìn)行大量的手動(dòng)調(diào)試,例如減小 JVM 堆空間萤彩、設(shè)置 Flink 使用堆外內(nèi)存等》嗦耍現(xiàn)在,F(xiàn)link 的開箱配置即可支持這一切雀扶,且只需要簡(jiǎn)單地改變 managed 內(nèi)存的大小即可調(diào)整 RocksDB state backend 的內(nèi)存預(yù)算杖小。
另一個(gè)重要的優(yōu)化是,F(xiàn)link 現(xiàn)在可以限制 RocksDB 的 native 內(nèi)存占用(FLINK-7289 [8])愚墓,以避免超過總的內(nèi)存預(yù)算——這對(duì)于 Kubernetes 等容器化部署環(huán)境尤為重要予权。關(guān)于如何開啟、調(diào)試該特性转绷,請(qǐng)參考 RocksDB 調(diào)試 [9]伟件。
注:FLIP-49 改變了集群的資源配置過程,因此從以前的 Flink 版本升級(jí)時(shí)可能需要對(duì)集群配置進(jìn)行調(diào)整议经。詳細(xì)的變更日志及調(diào)試指南請(qǐng)參考文檔 [10]。
統(tǒng)一的作業(yè)提交邏輯
在此之前谴返,提交作業(yè)是由執(zhí)行環(huán)境負(fù)責(zé)的煞肾,且與不同的部署目標(biāo)(例如 Yarn, Kubernetes, Mesos)緊密相關(guān)。這導(dǎo)致用戶需要針對(duì)不同環(huán)境保留多套配置嗓袱,增加了管理的成本籍救。
在 Flink 1.10 中,作業(yè)提交邏輯被抽象到了通用的 Executor 接口(FLIP-73 [11])渠抹。新增加的 ExecutorCLI (FLIP-81 [12])引入了為任意執(zhí)行目標(biāo) [13] 指定配置參數(shù)的統(tǒng)一方法蝙昙。此外,隨著引入 JobClient(FLINK-74 [14])負(fù)責(zé)獲取 JobExecutionResult梧却,獲取作業(yè)執(zhí)行結(jié)果的邏輯也得以與作業(yè)提交解耦奇颠。
上述改變向用戶提供了統(tǒng)一的 Flink 入口,使得在 Apache Beam 或 Zeppelin notebooks 等下游框架中以編程方式使用 Flink 變的更加容易放航。對(duì)于需要在多種不同環(huán)境使用 Flink 的用戶而言烈拒,新的基于配置的執(zhí)行過程同樣顯著降低了冗余代碼量以及維護(hù)開銷。
原生 Kubernetes 集成(Beta)
對(duì)于想要在容器化環(huán)境中嘗試 Flink 的用戶來說,想要在 Kubernetes 上部署和管理一個(gè) Flink standalone 集群荆几,首先需要對(duì)容器吓妆、算子及像 kubectl 這樣的環(huán)境工具有所了解。
在 Flink 1.10 中吨铸,我們推出了初步的支持 session 模式的主動(dòng) Kubernetes 集成(FLINK-9953 [15])行拢。其中,“主動(dòng)”指 Flink ResourceManager (K8sResMngr) 原生地與 Kubernetes 通信诞吱,像 Flink 在 Yarn 和 Mesos 上一樣按需申請(qǐng) pod舟奠。用戶可以利用 namespace,在多租戶環(huán)境中以較少的資源開銷啟動(dòng) Flink狐胎。這需要用戶提前配置好 RBAC 角色和有足夠權(quán)限的服務(wù)賬號(hào)鸭栖。
正如在統(tǒng)一的作業(yè)提交邏輯一節(jié)中提到的,F(xiàn)link 1.10 將命令行參數(shù)映射到了統(tǒng)一的配置握巢。因此晕鹊,用戶可以參閱 Kubernetes 配置選項(xiàng),在命令行中使用以下命令向 Kubernetes 提交 Flink 作業(yè)暴浦。
復(fù)制代碼
./bin/flink run -d -e kubernetes-session -Dkubernetes.cluster-id= examples/streaming/WindowJoin.jar如果你希望第一時(shí)間嘗試這一特性溅话,歡迎參考相關(guān)文檔 [16]、試用并與社區(qū)分享你的反饋意見歌焦。
Table API/SQL: 生產(chǎn)可用的 Hive 集成
Flink 1.9 推出了預(yù)覽版的 Hive 集成飞几。該版本允許用戶使用 SQL DDL 將 Flink 特有的元數(shù)據(jù)持久化到 Hive Metastore、調(diào)用 Hive 中定義的 UDF 以及讀独撇、寫 Hive 中的表屑墨。Flink 1.10 進(jìn)一步開發(fā)和完善了這一特性,帶來了全面兼容 Hive 主要版本 [17] 的生產(chǎn)可用的 Hive 集成纷铣。
■?Batch SQL 原生分區(qū)支持
此前卵史,F(xiàn)link 只支持寫入未分區(qū)的 Hive 表。在 Flink 1.10 中搜立,F(xiàn)link SQL 擴(kuò)展支持了 INSERT OVERWRITE 和 PARTITION 的語法(FLIP-63 [18])以躯,允許用戶寫入 Hive 中的靜態(tài)和動(dòng)態(tài)分區(qū)。
寫入靜態(tài)分區(qū)復(fù)制代碼
INSERT { INTO | OVERWRITE } TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;寫入動(dòng)態(tài)分區(qū)復(fù)制代碼
INSERT { INTO | OVERWRITE } TABLE tablename1 select_statement1 FROM from_statement;對(duì)分區(qū)表的全面支持啄踊,使得用戶在讀取數(shù)據(jù)時(shí)能夠受益于分區(qū)剪枝忧设,減少了需要掃描的數(shù)據(jù)量,從而大幅提升了這些操作的性能颠通。
■ 其他優(yōu)化
除了分區(qū)剪枝址晕,F(xiàn)link 1.10 的 Hive 集成還引入了許多數(shù)據(jù)讀取 [19] 方面的優(yōu)化,例如:
投影下推:Flink 采用了投影下推技術(shù)蒜哀,通過在掃描表時(shí)忽略不必要的域斩箫,最小化 Flink 和 Hive 表之間的數(shù)據(jù)傳輸量吏砂。這一優(yōu)化在表的列數(shù)較多時(shí)尤為有效。LIMIT 下推:對(duì)于包含 LIMIT 語句的查詢乘客,F(xiàn)link 在所有可能的地方限制返回的數(shù)據(jù)條數(shù)狐血,以降低通過網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。讀取數(shù)據(jù)時(shí)的 ORC 向量化:為了提高讀取 ORC 文件的性能易核,對(duì)于 Hive 2.0.0 及以上版本以及非復(fù)合數(shù)據(jù)類型的列匈织,F(xiàn)link 現(xiàn)在默認(rèn)使用原生的 ORC 向量化讀取器∧抵保■?將可插拔模塊作為 Flink 內(nèi)置對(duì)象(Beta)
Flink 1.10 在 Flink table 核心引入了通用的可插拔模塊機(jī)制缀匕,目前主要應(yīng)用于系統(tǒng)內(nèi)置函數(shù)(FLIP-68 [20])。通過模塊碰逸,用戶可以擴(kuò)展 Flink 的系統(tǒng)對(duì)象乡小,例如像使用 Flink 系統(tǒng)函數(shù)一樣使用 Hive 內(nèi)置函數(shù)。新版本中包含一個(gè)預(yù)先實(shí)現(xiàn)好的 HiveModule饵史,能夠支持多個(gè) Hive 版本满钟,當(dāng)然用戶也可以選擇編寫自己的可插拔模塊 [21]。
其他 Table API/SQL 優(yōu)化
■?SQL DDL 中的 watermark 和計(jì)算列
Flink 1.10 在 SQL DDL 中增加了針對(duì)流處理定義時(shí)間屬性及產(chǎn)生 watermark 的語法擴(kuò)展(FLIP-66 [22])胳喷。這使得用戶可以在用 DDL 語句創(chuàng)建的表上進(jìn)行基于時(shí)間的操作(例如窗口)以及定義 watermark 策略 [23]湃番。
復(fù)制代碼
CREATE TABLE table_name ( WATERMARK FOR columnName AS ) WITH (...)?■?其他 SQL DDL 擴(kuò)展
Flink 現(xiàn)在嚴(yán)格區(qū)分臨時(shí) / 持久、系統(tǒng) / 目錄函數(shù)(FLIP-57 [24])吭露。這不僅消除了函數(shù)引用中的歧義吠撮,還帶來了確定的函數(shù)解析順序(例如,當(dāng)存在命名沖突時(shí)讲竿,比起目錄函數(shù)泥兰、持久函數(shù) Flink 會(huì)優(yōu)先使用系統(tǒng)函數(shù)、臨時(shí)函數(shù))题禀。
在 FLIP-57 的基礎(chǔ)上逾条,我們擴(kuò)展了 SQL DDL 的語法,支持創(chuàng)建目錄函數(shù)投剥、臨時(shí)函數(shù)以及臨時(shí)系統(tǒng)函數(shù)(FLIP-79 [25]):
復(fù)制代碼
CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF NOT EXISTS] [catalog_name.][db_name.]function_name AS identifier [LANGUAGE JAVA|SCALA]關(guān)于目前完整的 Flink SQL DDL 支持,請(qǐng)參考最新的文檔 [26]担孔。
注:為了今后正確地處理和保證元對(duì)象(表江锨、視圖、函數(shù))上的行為一致性糕篇,F(xiàn)link 廢棄了 Table API 中的部分對(duì)象申明方法啄育,以使留下的方法更加接近標(biāo)準(zhǔn)的 SQL DDL(FLIP-64 [27])。
■?批處理完整的 TPC-DS 覆蓋
TPC-DS 是廣泛使用的業(yè)界標(biāo)準(zhǔn)決策支持 benchmark拌消,用于衡量基于 SQL 的數(shù)據(jù)處理引擎性能挑豌。Flink 1.10 端到端地支持所有 TPC-DS 查詢(FLINK-11491 [28]),標(biāo)志著 Flink SQL 引擎已經(jīng)具備滿足現(xiàn)代數(shù)據(jù)倉(cāng)庫及其他類似的處理需求的能力。
PyFlink: 支持原生用戶自定義函數(shù)(UDF)
作為 Flink 全面支持 Python 的第一步氓英,在之前版本中我們發(fā)布了預(yù)覽版的 PyFlink侯勉。在新版本中,我們專注于讓用戶在 Table API/SQL 中注冊(cè)并使用自定義函數(shù)(UDF铝阐,另 UDTF / UDAF 規(guī)劃中)(FLIP-58 [29])址貌。
如果你對(duì)這一特性的底層實(shí)現(xiàn)(基于 Apache Beam 的可移植框架 [30])感興趣,請(qǐng)參考 FLIP-58 的 Architecture 章節(jié)以及 FLIP-78 [31]徘键。這些數(shù)據(jù)結(jié)構(gòu)為支持 Pandas 以及今后將 PyFlink 引入到 DataStream API 奠定了基礎(chǔ)练对。
從 Flink 1.10 開始,用戶只要執(zhí)行以下命令就可以輕松地通過 pip 安裝 PyFlink:
復(fù)制代碼
pip install apache-flink更多 PyFlink 規(guī)劃中的優(yōu)化吹害,請(qǐng)參考 FLINK-14500[32]螟凭,同時(shí)歡迎加入有關(guān)用戶需求的討論 [33]。
重要變更
FLINK-10725[34]:Flink 現(xiàn)在可以使用 Java 11 編譯和運(yùn)行它呀。FLINK-15495[35]:SQL 客戶端現(xiàn)在默認(rèn)使用 Blink planner螺男,向用戶提供最新的特性及優(yōu)化。Table API 同樣計(jì)劃在下個(gè)版本中從舊的 planner 切換到 Blink planner钟些,我們建議用戶現(xiàn)在就開始嘗試和熟悉 Blink planner烟号。FLINK-13025[36]:新的 Elasticsearch sink connector[37] 全面支持 Elasticsearch 7.x 版本。FLINK-15115[38]:Kafka 0.8 和 0.9 的 connector 已被標(biāo)記為廢棄并不再主動(dòng)支持政恍。如果你還在使用這些版本或有其他相關(guān)問題汪拥,請(qǐng)通過 @dev 郵件列表聯(lián)系我們。FLINK-14516[39]:非基于信用的網(wǎng)絡(luò)流控制已被移除篙耗,同時(shí)移除的還有配置項(xiàng)“taskmanager.network.credit.model”迫筑。今后,F(xiàn)link 將總是使用基于信用的網(wǎng)絡(luò)流控制宗弯。FLINK-12122[40]:在 Flink 1.5.0 中脯燃,F(xiàn)LIP-6[41] 改變了 slot 在 TaskManager 之間的分布方式。要想使用此前的調(diào)度策略蒙保,既盡可能將負(fù)載分散到所有當(dāng)前可用的 TaskManager辕棚,用戶可以在 flink-conf.yaml 中設(shè)置 “cluster.evenly-spread-out-slots: true”。FLINK-11956[42]:s3-hadoop 和 s3-presto 文件系統(tǒng)不再使用類重定位加載方式邓厕,而是使用插件方式加載逝嚎,同時(shí)無縫集成所有認(rèn)證提供者。我們強(qiáng)烈建議其他文件系統(tǒng)也只使用插件加載方式详恼,并將陸續(xù)移除重定位加載方式补君。Flink 1.9 推出了新的 Web UI,同時(shí)保留了原來的 Web UI 以備不時(shí)之需昧互。截至目前挽铁,我們沒有收到關(guān)于新的 UI 存在問題的反饋伟桅,因此社區(qū)投票決定 [43] 在 Flink 1.10 中移除舊的 Web UI。發(fā)行說明
準(zhǔn)備升級(jí)到 Flink 1.10 的用戶叽掘,請(qǐng)參考發(fā)行說明 [44] 中的詳細(xì)變更及新特性列表楣铁。對(duì)于標(biāo)注為 @Public 的 API,此版本與此前的 1.x 版本 API 兼容够掠。
參考鏈接:
[1] https://flink.apache.org/news/2019/08/22/release-1.9.0.html#preview-of-the-new-blink-sql-query-processor[2] https://flink.apache.org/downloads.html[3] https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&version=12345845[4] https://ci.apache.org/projects/flink/flink-docs-release-1.10/[5] https://flink.apache.org/community.html#mailing-lists[6] https://issues.apache.org/jira/projects/FLINK/summary[7] https://cwiki.apache.org/confluence/display/FLINK/FLIP-49%3A+Unified+Memory+Configuration+for+TaskExecutors[8] https://issues.apache.org/jira/browse/FLINK-7289[9] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/state/large_state_tuning.html#tuning-rocksdb-memory[10] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/mem_setup.html[11] https://cwiki.apache.org/confluence/display/FLINK/FLIP-73%3A+Introducing+Executors+for+job+submission[12] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=133631524 )[13] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/cli.html#deployment-targets[14] https://cwiki.apache.org/confluence/display/FLINK/FLIP-74%3A+Flink+JobClient+API )[15] https://jira.apache.org/jira/browse/FLINK-9953[16] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/deployment/native_kubernetes.html[17] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/hive/#supported-hive-versions[18] https://cwiki.apache.org/confluence/display/FLINK/FLIP-63%3A+Rework+table+partition+support[19] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/hive/read_write_hive.html#optimizations[20] https://cwiki.apache.org/confluence/display/FLINK/FLIP-68%3A+Extend+Core+Table+System+with+Pluggable+Modules[21] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/modules.html[22] https://cwiki.apache.org/confluence/display/FLINK/FLIP-66%3A+Support+Time+Attribute+in+SQL+DDL[23] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/sql/create.html#create-table[24] https://cwiki.apache.org/confluence/display/FLINK/FLIP-57%3A+Rework+FunctionCatalog[25] https://cwiki.apache.org/confluence/display/FLINK/FLIP-79+Flink+Function+DDL+Support[26] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/sql/[27] https://cwiki.apache.org/confluence/display/FLINK/FLIP-64%3A+Support+for+Temporary+Objects+in+Table+module[28] https://issues.apache.org/jira/browse/FLINK-11491[29] https://cwiki.apache.org/confluence/display/FLINK/FLIP-58%3A+Flink+Python+User-Defined+Stateless+Function+for+Table[30] https://beam.apache.org/roadmap/portability/[31] https://cwiki.apache.org/confluence/display/FLINK/FLIP-78%3A+Flink+Python+UDF+Environment+and+Dependency+Management[32] https://issues.apache.org/jira/browse/FLINK-14500[33] http://apache-flink.147419.n8.nabble.com/Re-DISCUSS-What-parts-of-the-Python-API-should-we-focus-on-next-td1285.html[34] https://issues.apache.org/jira/browse/FLINK-10725[35] https://jira.apache.org/jira/browse/FLINK-15495[36] https://issues.apache.org/jira/browse/FLINK-13025 )][37] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/connectors/elasticsearch.html#elasticsearch-connector[38] https://issues.apache.org/jira/browse/FLINK-15115[39] https://issues.apache.org/jira/browse/FLINK-13884[40] https://issues.apache.org/jira/browse/FLINK-12122[41] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=65147077[42] https://issues.apache.org/jira/browse/FLINK-11956[43] http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Remove-old-WebUI-td35218.html[44] https://ci.apache.org/projects/flink/flink-docs-release-1.10/release-notes/flink-1.10.html
原文鏈接:
https://flink.apache.org/news/2020/02/11/release-1.10.0.html