官宣|Apache Flink 1.18 發(fā)布公告

Apache Flink 1.18 發(fā)布公告.png

Apache Flink PMC 已正式發(fā)布 Apache Flink 1.18.0 版本。與往常一樣,這是一個(gè)充實(shí)的版本,包含了廣泛的改進(jìn)和新功能??偣灿?174 人為此版本做出了貢獻(xiàn),完成了 18 個(gè) FLIPs 和 700 多個(gè)問題。感謝各位貢獻(xiàn)者的支持!

邁向 Streaming Lakehouse

Flink SQL 提升

Flink SQL Gateway 的 JDBC Driver

Flink 1.18 版本提供了 Flink SQL Gateway 的 JDBC Driver。因此,您現(xiàn)在可以使用支持 JDBC 的任何 SQL 客戶端通過 Flink SQL 與您的表進(jìn)行交互。以下是使用 SQLLine 的示例。

sqlline version 1.12.0
sqlline> !connect jdbc:flink://localhost:8083
Enter username for jdbc:flink://localhost:8083:
Enter password for jdbc:flink://localhost:8083:
0: jdbc:flink://localhost:8083> CREATE TABLE T(
. .)>      a INT,
. .)>      b VARCHAR(10)
. .)>  ) WITH (
. .)>      'connector' = 'filesystem',
. .)>      'path' = 'file:///tmp/T.csv',
. .)>      'format' = 'csv'
. .)>  );
No rows affected (0.122 seconds)
0: jdbc:flink://localhost:8083> INSERT INTO T VALUES (1, 'Hi'), (2, 'Hello');
+----------------------------------+
|              job id              |
+----------------------------------+
| fbade1ab4450fc57ebd5269fdf60dcfd |
+----------------------------------+
1 row selected (1.282 seconds)
0: jdbc:flink://localhost:8083> SELECT * FROM T;
+---+-------+
| a |   b   |
+---+-------+
| 1 | Hi    |
| 2 | Hello |
+---+-------+
2 rows selected (1.955 seconds)
0: jdbc:flink://localhost:8083>

更多信息

Flink 連接器的存儲過程(Stored Procedure)支持

存儲過程(Stored Procedure)在傳統(tǒng)數(shù)據(jù)庫中一直是不可或缺的工具,它提供了一種方便的方式來封裝用于數(shù)據(jù)操作和任務(wù)管理的復(fù)雜邏輯。存儲過程還提供了增強(qiáng)性能的潛力,因?yàn)樗鼈兛梢灾苯釉谕獠繑?shù)據(jù)庫中觸發(fā)數(shù)據(jù)操作的處理。其他流行的數(shù)據(jù)系統(tǒng)如 Trino 和 Iceberg 將常見的維護(hù)任務(wù)自動化并簡化為一小組存儲過程,從而大大減輕了用戶的管理負(fù)擔(dān)。

本次更新主要針對 Flink 連接器的開發(fā)人員,他們現(xiàn)在可以通過 Catalog 接口預(yù)定義自定義存儲過程到連接器中。對用戶的主要好處是,以前需要編寫自定義 Flink 代碼來實(shí)現(xiàn)的連接器特定任務(wù)現(xiàn)在可以用封裝化、標(biāo)準(zhǔn)化和潛在優(yōu)化底層操作的簡單調(diào)用來替代。用戶可以使用熟悉的 CALL 語法執(zhí)行存儲過程,并使用 SHOW PROCEDURES 查看連接器的可用存儲過程。連接器內(nèi)的存儲過程提高了 Flink 的 SQL 和 Table API 的可擴(kuò)展性,為用戶提供更順暢的數(shù)據(jù)訪問和管理能力。

用戶可以使用 Call 語句來直接調(diào)用 catalog 內(nèi)置的存儲過程(注:catalog 內(nèi)置的存儲過程請參考對應(yīng) catalog 的文檔)。比如可以通過如下 Call 語句對 Paimon 表進(jìn)行 compact 操作:

CREATE TABLE `paimon`.`default`.`T` ( 
 id BIGINT PRIMARY KEY NOT ENFORCED,  
 dt STRING, -- format 'yyyy-MM-dd'  
 v STRING
);

-- use catalog before call 
proceduresUSE CATALOG `paimon`;

-- compact the whole table using call statement
CALL sys.compact('default.T');

更多信息

DDL 支持?jǐn)U展

從 1.18 版本開始,F(xiàn)link 支持以下功能:

  • REPLACE TABLE AS SELECT
  • CREATE OR REPLACE TABLE AS SELECT

這兩個(gè)命令以及之前支持的 CREATE TABLE AS 現(xiàn)在都支持原子性,前提是底層連接器也支持。

此外,Apache Flink 現(xiàn)在支持在批處理模式下執(zhí)行 TRUNCATE TABLE。與以前一樣,底層連接器需要實(shí)現(xiàn)并提供此功能。

最后,我們還實(shí)現(xiàn)了通過以下方式支持添加、刪除和列出分區(qū):

  • ALTER TABLE ADD PARTITION
  • ALTER TABLE DROP PARTITION
  • SHOW PARTITIONS

更多信息

時(shí)間旅行(Time Traveling)

Flink 支持時(shí)間旅行(time travel) SQL 語法,用于查詢歷史版本的數(shù)據(jù)。用戶可以指定一個(gè)時(shí)間點(diǎn),來檢索表在該時(shí)間點(diǎn)的數(shù)據(jù)和架構(gòu)。借助時(shí)間旅行功能,用戶可以輕松分析和比較數(shù)據(jù)的歷史版本。

例如,用戶可以通過如下的語句查詢一張表指定時(shí)間點(diǎn)的數(shù)據(jù);

-- 查詢表 `paimon_tb` 在 2022年11月11日的數(shù)據(jù)

SELECT * FROM paimon_tb FOR SYSTEM_TIME AS OF TIMESTAMP '2022-11-11 00:00:00';

更多信息

流處理提升

Table API & SQL 支持算子級別狀態(tài)保留時(shí)間(TTL)

從 Flink 1.18 版本開始,Table API 和 SQL 用戶可以為有狀態(tài)的算子單獨(dú)設(shè)置狀態(tài)保留時(shí)間 (TTL)。在像流 regular join 這樣的場景中,用戶現(xiàn)在可以為左側(cè)和右側(cè)流設(shè)置不同的 TTL。在以前的版本中,狀態(tài)保留時(shí)間只能在 pipeline 級別使用配置項(xiàng) table.exec.state.ttl 進(jìn)行控制。引入算子級別的狀態(tài)保留后,用戶現(xiàn)在可以根據(jù)其具體需求優(yōu)化資源使用。

更多信息

SQL 的水印對齊(Watermark Alignment)和空閑檢測(Idleness Detection)

現(xiàn)在,您可以使用 SQL Hint 配置水印對齊數(shù)據(jù)源空閑超時(shí)。之前這些功能僅在 DataStream API 中可用。

更多信息

批處理提升

Hybrid Shuffle 支持遠(yuǎn)程存儲

Hybrid Shuffle 支持將 Shuffle 數(shù)據(jù)存儲在遠(yuǎn)程存儲中??梢允褂门渲庙?xiàng) taskmanager.network.hybrid-shuffle.remote.path 配置遠(yuǎn)程存儲路徑。Hybrid Shuffle 通過將內(nèi)存用量與并行度解耦,減少了網(wǎng)絡(luò)內(nèi)存的使用,提高了穩(wěn)定性和易用性。

更多信息

性能提升與 TPC-DS 基準(zhǔn)測試

在之前的版本中,社區(qū)投入了大量精力來改進(jìn) Flink 的批處理性能,產(chǎn)生了顯著的改進(jìn)。在這個(gè)發(fā)布周期中,社區(qū)的貢獻(xiàn)者繼續(xù)付出了重大努力,進(jìn)一步改進(jìn)了 Flink 的批處理性能。

Flink SQL 的運(yùn)行時(shí)過濾(Runtime Filter)

運(yùn)行時(shí)過濾(Runtime Filter)是用于優(yōu)化 join 性能的常見方法。它旨在動態(tài)生成某些 join 查詢的運(yùn)行時(shí)過濾條件,以減少掃描或 Shuffle 的數(shù)據(jù)量,避免不必要的 I/O 和網(wǎng)絡(luò)傳輸,從而加速查詢。我們在 Flink 1.18 版本引入了運(yùn)行時(shí)過濾,并通過 TPC-DS 基準(zhǔn)測試驗(yàn)證了其有效性,觀察到啟用此功能后,某些查詢的速度提高了 3 倍。

Flink SQL 算子的融合代碼生成(Operator Fusion Codegen)

算子融合代碼生成(Operator Fusion Codegen)通過將算子 DAG 融合成一個(gè)經(jīng)過優(yōu)化的單算子,消除了虛函數(shù)調(diào)用,利用 CPU 寄存器進(jìn)行中間數(shù)據(jù)操作,并減少指令緩存不命中的情況,從而提高了查詢的執(zhí)行性能。作為一項(xiàng)技術(shù)優(yōu)化,我們通過 TPC-DS 驗(yàn)證了其有效性,部分批處理算子(Calc、HashAgg 和 HashJoin)在 1.18 版本中完成了融合代碼生成支持,很多查詢性能顯著提高。

請注意,上述兩個(gè)功能默認(rèn)情況下處于關(guān)閉狀態(tài)??梢酝ㄟ^使用 table.optimizer.runtime-filter.enabled 和 table.exec.operator-fusion-codegen.enabled 兩個(gè)配置項(xiàng)來啟用它們。

自 Flink 1.16 以來,Apache Flink 社區(qū)一直在通過 TPC-DS 基準(zhǔn)測試框架持續(xù)跟蹤其批處理引擎的性能。在 Flink 1.17 版本中經(jīng)過重大改進(jìn)(動態(tài) join 重排序、動態(tài) local aggregation)后,前面描述的兩項(xiàng)改進(jìn)(算子融合、運(yùn)行時(shí)過濾)在分區(qū)表 10T 數(shù)據(jù)集上,與 Flink 1.17 相比性能提高了 14%,與 Flink 1.16 相比性能提高了 54%。

1.png

更多信息

邁向云原生彈性化

彈性化(Elasticity)描述了系統(tǒng)在不中斷的情況下適應(yīng)工作負(fù)載變化的能力,理想情況下是以自動方式進(jìn)行。這是云原生系統(tǒng)的一個(gè)定義特征,對于長時(shí)間運(yùn)行的流處理工作負(fù)載尤為重要。因此,彈性性能的改進(jìn)是 Apache Flink 社區(qū)不斷投入的領(lǐng)域。最近的提議包括 Kubernetes 自動縮放器(Autoscaler)、對性能調(diào)整的眾多改進(jìn),以及自適應(yīng)調(diào)度器(Adaptive Scheduler)。

自 Flink 1.15 版本首次引入以來,自適應(yīng)調(diào)度器構(gòu)成了完全彈性 Apache Flink 部署的核心。在其核心功能中,它允許作業(yè)在運(yùn)行時(shí)更改其資源要求和并行度。此外,它還根據(jù)集群中可用的資源進(jìn)行自適應(yīng)調(diào)整,只有當(dāng)集群能夠滿足作業(yè)的最低所需資源時(shí)才會重新調(diào)整。

在 Flink 1.18 版本之前,自適應(yīng)調(diào)度器主要用于響應(yīng)模式(Reactive Mode),根據(jù)設(shè)計(jì),單個(gè)作業(yè)始終會使用集群中的所有可用資源。請參閱這篇博客文章,了解如何使用 Kubernetes 上的水平 Pod 自動縮放器自動縮放 Flink 作業(yè)。

在 Flink 1.18 版本中,自適應(yīng)調(diào)度器變得更加強(qiáng)大和更廣泛適用,并正在成為 Apache Flink 流處理任務(wù)的默認(rèn)調(diào)度器。

通過 REST API 控制動態(tài)細(xì)粒度擴(kuò)縮容

盡管自適應(yīng)調(diào)度器具有在運(yùn)行時(shí)更改作業(yè)資源需求的能力,但此功能之前一直未開放給用戶,自 Flink 1.18 起,在作業(yè)運(yùn)行時(shí),您可以通過 Flink Web UI 和 REST API 更改作業(yè)的任何 task 的并行度。

實(shí)現(xiàn)細(xì)節(jié)上,Apache Flink 在獲得新并行度所需的資源后會立即執(zhí)行擴(kuò)縮容操作。擴(kuò)縮容操作不基于 savepoint,而是基于普通的定期 checkpoint,這意味著它不會引入額外的 snapshot。對于狀態(tài)規(guī)模較小的作業(yè),重新調(diào)整操作幾乎立即發(fā)生,且中斷時(shí)間非常短。

與 Apache Flink Web UI 的反壓監(jiān)控相結(jié)合,現(xiàn)在更容易找到并維護(hù)使每個(gè)任務(wù)高效運(yùn)行、無反壓的并行度。

  • 如果一個(gè)任務(wù)非常繁忙(紅色),您可以增加并行度。
  • 如果一個(gè)任務(wù)大部分時(shí)間處于空閑狀態(tài)(藍(lán)色),您可以減少并行度。
2.png

更多信息

更快地 RocksDB 擴(kuò)縮容

使用 RocksDB 狀態(tài)后端和增量 checkpoint 的擴(kuò)縮容時(shí)間在第 99 百分位數(shù)(99th percentile)上提高了約 30%。我們提升了并行下載的能力,從只并行下載狀態(tài)句柄(state handle),擴(kuò)展到并行下載文件。此外,我們關(guān)閉了用于擴(kuò)縮容的臨時(shí) RocksDB 實(shí)例在批量插入時(shí)的寫前日志(write-ahead-logging)。

3.png

更多信息

Java 17 支持

Java 17 于 2021 年發(fā)布,是 Java 的最新長期支持(LTS)版本,將于 2029 年終止支持。從 Flink 1.18 版本開始,您現(xiàn)在可以在 Java 17 上運(yùn)行 Apache Flink。官方 Docker 倉庫目前已包含基于 Java 17 的鏡像:

docker pull flink:1.18.0-java17

如果您的集群運(yùn)行在 Java 17 上,您的用戶程序中也可以使用 Java 17 的功能,并將其編譯為 Java 17 版本。

更多信息

其他改進(jìn)

生產(chǎn)可用的水印對齊(Watermark Alignment)功能

自 Flink 1.16 和 Flink 1.17 版本以來以 Beta 形式支持的水印對齊已在實(shí)際環(huán)境中經(jīng)過大規(guī)模的充分測試。在此期間,社區(qū)已經(jīng)收集并解決了發(fā)現(xiàn)的錯(cuò)誤和性能問題。隨著這些問題的解決,我們推薦水印對齊功能供一般使用。

更多信息

可插拔式故障處理

Apache Flink 作為許多公司流處理平臺的基礎(chǔ),也是許多商業(yè)流處理服務(wù)的基礎(chǔ)。因此,能夠輕松集成到內(nèi)部和供應(yīng)商平臺更廣泛生態(tài)系統(tǒng)中的能力變得越來越重要。Catalog 修改監(jiān)聽器和可插拔式故障處理程序?qū)儆谶@一類改進(jìn)。

更多信息

SQL 客戶端的改進(jìn)

在 1.18 版本中,SQL 客戶端進(jìn)行了一系列的易用性改進(jìn):

  • 客戶端更加多彩,可開啟 SQL 語法突出顯示和切換 7 種不同配色方案。
  • 更容易編輯和預(yù)覽大查詢。
  • 可隨時(shí)關(guān)閉和打開行號。

更多信息

Apache Pekko 代替 Akka

一年前,Lightbend 宣布將 Akka 未來版本(2.7+)的許可證從 Apache 2.0 更改為 BSL,Apache Flink 使用的 Akka 2.6 版本將在 2023 年 9 月之前接收安全更新和關(guān)鍵錯(cuò)誤修復(fù)。因此在 Flink 1.18 版本,我們決定從 Akka 切換到Apache Pekko(Incubating)。Apache Pekko (Incubating) 基于 Akka 項(xiàng)目采用商業(yè)源代碼許可證之前的 Akka 2.6.x。Pekko 最近發(fā)布了 Apache Pekko 1.0.1-incubating,我們即刻在 Flink 1.18 中進(jìn)行使用。雖然我們的中期計(jì)劃是完全放棄對 Akka 或 Pekko 的依賴(參見 FLINK-29281),但切換到 Pekko 提供了一個(gè)良好的短期解決方案,并確保了 Apache Pekko 和 Apache Flink 社區(qū)能夠處理整個(gè)軟件供應(yīng)鏈中的關(guān)鍵錯(cuò)誤修復(fù)和安全漏洞。

更多信息

Calcite 升級

在 Apache Flink 1.18 中,Apache Calcite 逐漸從 1.29 版本升級到 1.32 版本。版本升級的帶來的好處包括錯(cuò)誤修復(fù)、更智能的優(yōu)化器和性能改進(jìn)。在解析器級別,它現(xiàn)在允許使用括號將 join 操作分組成樹狀結(jié)構(gòu)(SQL-92)。例如 SELECT * FROM a JOIN (b JOIN c ON b.x = c.x) ON a.y = c.y,請參閱 CALCITE-35。此外,升級到 Calcite 1.31+ 解鎖了通過表值函數(shù)支持會話窗口(Session Windows via Table-Valued Functions,參見 CALCITE-4865、FLINK-24024),并棄用舊的分組窗口聚合(Group Window Aggregations)。由于 CALCITE-4861,F(xiàn)link 的強(qiáng)制類型轉(zhuǎn)換行為略有改變。一些邊界情況現(xiàn)在可能會有不同的行為:例如,從 FLOAT/DOUBLE 9234567891.12 到 INT/BIGINT 的強(qiáng)制類型轉(zhuǎn)換會產(chǎn)生 Java 的溢出行為。

更多信息

重要 API 棄用

為了為明年發(fā)布的 Flink 2.0 版本做準(zhǔn)備,社區(qū)已經(jīng)決定正式棄用多個(gè)接近生命周期結(jié)束的 API。

  • SourceFunction現(xiàn)在已經(jīng)棄用。如果您仍在使用基于 SourceFunction 構(gòu)建的連接器,請將其遷移到 Source。SinkFunction 目前尚未正式棄用,但它也即將接近生命周期結(jié)束,將被 SinkV2 所取代。
  • Queryable State現(xiàn)已棄用,將在 Flink 2.0 中移除。
  • DataSet API現(xiàn)已棄用。建議用戶遷移到執(zhí)行模式設(shè)置為 BATCH 的 DataStream API。

升級注意事項(xiàng)

Flink 社區(qū)盡力確保無縫升級。然而,某些變更可能需要用戶在升級到 1.18 版本時(shí)對程序的某些部分進(jìn)行調(diào)整。請參考發(fā)行說明,以獲取升級過程中需要進(jìn)行的調(diào)整和要檢查的問題的綜合列表。

貢獻(xiàn)者列表

Apache Flink 社區(qū)向所有為這個(gè)版本的實(shí)現(xiàn)做出貢獻(xiàn)的貢獻(xiàn)者表示感謝:

Aitozi, Akinfolami Akin-Alamu, Alain Brown, Aleksandr Pilipenko, Alexander Fedulov, Anton Kalashnikov, Archit Goyal, Bangui Dunn, Benchao Li, BoYiZhang, Chesnay Schepler, Chris Nauroth, Colten Pilgreen, Danny Cranmer, David Christle, David Moravek, Dawid Wysakowicz, Deepyaman Datta, Dian Fu, Dian Qi, Dong Lin, Eric Xiao, Etienne Chauchot, Feng Jin, Ferenc Csaky, Fruzsina Nagy, Gabor Somogyi, Gunnar Morling, Gyula Fora, HaiYang Chen, Hang Ruan, Hangxiang Yu, Hanyu Zheng, Hong Liang Teoh, Hongshun Wang, Huston, Jacky Lau, James Hughes, Jane Chan, Jark Wu, Jayadeep Jayaraman, Jia Liu, JiangXin, Joao Boto, Junrui Lee, Juntao Hu, K.I. (Dennis) Jung, Kaiqi Dong, L, Leomax_Sun, Leonard Xu, Licho, Lijie Wang, Liu Jiangang, Lyn Zhang, Maomao Min, Martijn Visser, Marton Balassi, Mason Chen, Matthew de Detrich, Matthias Pohl, Min, Mingliang Liu, Mohsen Rezaei, Mrart, Mulavar, Nicholas Jiang, Nicolas Fraison, Noah, Panagiotis Garefalakis, Patrick Lucas, Paul Lin, Peter Vary, Piotr Nowojski, Qingsheng Ren, Ran Tao, Rich Bowen, Robert Metzger, Roc Marshal, Roman Khachatryan, Ron, Rui Fan, Ryan Skraba, Samrat002, Sergey Nuyanzin, Sergio Morales, Shammon FY, ShammonFY, Shengkai, Shuiqiang Chen, Stefan Richter, Tartarus0zm, Timo Walther, Tzu-Li (Gordon) Tai, Venkata krishnan Sowrirajan, Wang FeiFan, Weihua Hu, Weijie Guo, Wencong Liu, Xiaogang Zhou, Xintong Song, XuShuai, Yanfei Lei, Yu Chen, Yubin Li, Yun Gao, Yun Tang, Yuxin Tan, Zakelly, Zhanghao Chen, ZhengYiWeng, Zhu Zhu, archzi, baiwuchang, cailiuyang, chenyuzhi, darenwkt, dongwoo kim, eason.qin, felixzh, fengli, frankeshi, fredia, godfrey he, haishui, hehuiyuan, huangxingbo, jiangxin, jiaoqingbo, jinfeng, jingge, kevin.cyj, kristoffSC, leixin, leiyanfei, liming.1018, lincoln lee, lincoln.lil, liujiangang, liuyongvs, luoyuxia, maigeiye, mas-chen, novakov-alexey, oleksandr.nitavskyi, pegasas, sammieliu, shammon, shammon FY, shuiqiangchen, slfan1989, sunxia, tison, tsreaper, wangfeifan, wangkang, whjshj, wuqqq, xiangyu0xf, xincheng.ljr, xmzhou, xuyu, xzw, yuanweining, yuchengxin, yunfengzhou-hub, yunhong, yuxia Luo, yuxiqian, zekai-li, zhangmang, zhengyunhong.zyh, zzzzzzzs, 沈嘉琦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容