官宣|Apache Flink 1.17 釋出公告

ApacheFlink發表於2023-03-24

Apache Flink PMC(專案管理委員)很高興地宣佈釋出 Apache Flink 1.17.0。Apache Flink 是領先的流處理標準,流批統一的資料處理概念在越來越多的公司中得到認可。得益於我們出色的社群和優秀的貢獻者,Apache Flink 在 Apache 社群中一直保持著快速增長,並且是最活躍的社群之一。Flink 1.17 有 172 位貢獻者熱情參與,完成了 7 個 FLIP 和 600 多個 issue,為社群帶來了許多令人興奮的新功能和改進。

邁向 Streaming Warehouse


為了在 流式數倉 [1] 領域實現更高效的處理,Flink 1.17 對批處理和流處理的效能和語義都進行了實質性的改進。這些增強措施代表了朝著建立一個更高效、更簡化的資料倉儲,能夠實時處理大量資料的目標邁進了一大步。
 
針對批處理,此次釋出包含了下述幾項新特性和改進。

  Streaming Warehouse API: FLIP-282 [2] 在 Flink SQL 中引入了新的 Delete 和 Update API,它們可以在 Batch 模式下工作。在此基礎上,外部儲存系統比如 Flink Table Store 可以透過這些新的 API 實現行級刪除和更新。同時對 ALTER TABLE 語法進行了增強,包括 ADD/MODIFY/DROP 列、主鍵和 watermark 的能力,這些增強使得使用者更容易維護後設資料。

  Batch 效能最佳化: 在 Flink 1.17 中,批處理作業的執行在效能、穩定性和可用性方面都得到了顯著改進。就效能而言,透過策略最佳化和運算元最佳化,如新的 join-reorder 演算法和自適應的本地雜湊聚合最佳化、Hive 聚合函式改進以及混合 shuffle 模式最佳化,這些改進帶來了 26% 的 TPC-DS 效能提升。就穩定性而言,Flink 1.17 預測執行可以支援所有運算元,自適應的批處理排程可以更好的應對資料傾斜場景。就可用性而言,批處理作業所需的調優工作已經大大減少。自適應的批處理排程已經預設開啟,混合 shuffle 模式現在可以相容預測執行和自適應批處理排程,同時所需的各種配置都進行了簡化。

  SQL Client/Gateway: Apache Flink 1.17 支援了 SQL Client 的 gateway 模式,允許使用者將 SQL 提交給遠端的 SQL Gateway。同時,使用者可以在 SQL Client 中使用 SQL 語句來管理作業,包括查詢作業資訊和停止正在執行的作業等。這表示 SQL Client/Gateway 已經演進為一個作業管理、提交工具。
針對流處理,Flink 1.17 完成了以下功能和改進:

  Streaming SQL 語義增強: 非確定性操作可能會導致不正確的結果或異常,這在 Streaming SQL 中是一個極具挑戰性的話題。Flink 1.17 修復了不正確的最佳化計劃和功能問題,並且引入了實驗性功能 PLAN_ADVICE,PLAN_ADVICE 可以為 SQL 使用者提供潛在的正確性風險提示和 SQL 最佳化建議。
  Checkpoint 改進: 通用增量 Checkpoint(GIC)增強了 Checkpoint 的速度和穩定性,Unaligned Checkpoint (UC) 在作業反壓時的穩定性也在 Flink 1.17 中提高至生產可用級別。此外,該版本新引入一個 REST API 使得使用者可以觸發自定義 Checkpoint 型別的 Checkpoint。
  Watermark 對齊完善: 高效的 watermark 處理直接影響 event time 作業的執行效率,在 Flink 1.17 中, FLIP-217 [3] 透過對 Source 運算元內部的 split 進行資料對齊發射,完善了 watermark 對齊功能。這一改進使得 Source 中 watermark 進度更加協調,從而減輕了下游運算元的快取過多資料,增強了流作業執行的整體效率。
  StateBackend 升級: 此次釋出將 FRocksDB [4] 的版本升級到了 6.20.3-ververica-2.0,對 RocksDBStateBackend 帶來了許多改進。例如在 slot 之間共享記憶體,支援 Apple Silicon 晶片組,如 Mac M1。Flink 1.17 版本還提供了引數擴大 TaskManager 的 slot 之間共享記憶體的範圍,提升了 TaskManager 中 slot 記憶體使用不均勻時的效率。

批處理


作為的流批一體的計算引擎,Apache Flink 在流處理領域持續領先,為了進一步增強其批處理能力,Flink 社群貢獻者在 Flink 1.17 版本的批處理的效能最佳化和生態完善方面付出了諸多努力。這讓使用者可以更輕鬆地基於 Flink 構建 Streaming Warehouse。

預測執行


在此次釋出中,預測執行支援了 Sink 運算元。在之前的版本中,為了避免不穩定性或不正確的結果,預測執行不會發生在 Sink 運算元上。Flink 1.17 豐富了 Sink 的上下文資訊,使得 新版 Sink [5] OutputFormat Sink [6] 都能獲取到當前執行例項的序號(attempt number),根據這個序號,Sink 運算元可以將同一子任務的多個不同例項生成的資料進行隔離,即使這些例項在同時執行。FinalizeOnMaster 介面也進行了改進,以便 OutputFormat Sink 可以知道哪些序號的例項成功產出了資料,從而正確地提交結果資料。當 Sink 的開發者確定該 Sink 可以正確的支援多個併發例項同時執行,就可以使其實現裝飾性介面 SupportsConcurrentExecutionAttempts,從而允許其進行預測執行。一些內建 Sink 已經支援了預測執行,包括 DiscardingSink、PrintSinkFunction、PrintSink、FileSink、FileSystemOutputFormat 和 HiveTableSink。

此外,預測執行的慢任務的檢測也獲得了改進。在之前,在決定哪些任務是慢任務時只考慮了任務的執行時間。現在,慢任務檢測器還會考慮了任務的輸入資料量。執行時間較長的任務,如果消費了更多的資料,不一定會被視為慢任務。這一改進有助於消除資料傾斜對慢任務檢測的負面影響。

自適應批處理排程器


在此次釋出中,自適應批處理排程器成為了批作業的預設排程器。該排程器可以根據每個 job vertex 處理的資料量,自動為其設定合適的並行度。這也是唯一一個支援預測執行的排程器。

自適應批排程器的配置得到了改進,以提高其易用性。使用者不再需要顯式將全域性預設並行度設定為-1 來開啟自動推導並行度功能。現在,如果設定了全域性預設並行度,其會被用做自動推導並行度的上界。一些配置項的名稱也進行了改進,以便於使用者理解。

此外,自適應批處理排程器的能力也得到了增強。現在它可以根據細粒度的資料分佈資訊,將資料更均勻的分配給下游任務。自動推導的並行度現在也不再被限制為 2 的冪。

混合 Shuffle 模式


此次釋出中,混合 Shuffle 模式帶來了多個重要改進:

  混合 Shuffle 模式現在支援自適應批排程器和預測執行。

  混合 Shuffle 模式現在支援重用中間資料,這帶來了顯著的效能改進。

  提高了穩定性,避免了在大規模生產環境中出現的穩定性問題。
更多詳細資訊可以在 混合 Shuffle [7] 部分找到。

TPC-DS


從 Flink 1.16 開始,Flink 社群持續最佳化批處理引擎的效能。在 Flink 1.16 中,引入了動態分割槽裁剪最佳化,但並非所有的 TPC-DS 查詢都可以被最佳化。Flink 1.17 對該最佳化的演算法進行了改進,使得大部分 TPC-DS 查詢都可以被最佳化。此外,Flink 1.17 中引入了動態規劃 join-reorder 演算法,與之前版本的演算法相比,該演算法效果更好,但搜尋空間更大。最佳化器可以根據查詢中 join 個數自動選擇合適的 join-reorder 演算法,使用者無需關心 join-reorder 演算法的細節(注意:join-reorder 預設未開啟,在執行 TPC-DS 時需要顯式啟用)。在運算元層面,Flink 1.17 引入了動態 local hash aggregation 策略,可以根據資料的分佈動態確定是否需要在本地進行聚合操作以提高效能。在執行時層面上,此次釋出移除了一些不必要的虛擬函式呼叫,以加快執行速度。從整體測試結果上看,相比 Flink 1.16,對於分割槽表在 10T 資料集下 Flink 1.17 有 26% 的效能提升。

官宣|Apache Flink 1.17 釋出公告

SQL Client/Gateway


Apache Flink 1.17 引入了一個名為"gateway 模式" 的新功能,允許使用者將 SQL 查詢提交到遠端的 SQL Gateway 從而像 embedded 模式一樣來使用 Gateway 的各種功能。這種新模式為使用者在使用 SQL Gateway 時提供了更多的便利。

此外,SQL Client/SQL Gateway 現在支援透過 SQL 語句來管理作業生命週期。使用者可以使用 SQL 語句顯示儲存在 JobManager 中的所有作業資訊,可以使用作業的唯一作業 ID 來停止執行中的作業。藉助這個新功能,SQL Client/SQL Gateway 現在幾乎擁有了與 Flink CLI 相同的功能,成為管理 Flink 作業的另一個更強大的工具。

SQL API


在現代大資料工作流中,SQL 引擎的行級刪除和更新能力變得越來越重要。應用場景包括為了符合監管要求而刪除特定一組資料、為了進行資料訂正而更新一行資料等。許多流行的計算引擎比如 Trino、Hive 等已經提供了這類支援。Flink 1.17 為 Batch 模式引入了新的 Delete 和 Update API,並將其暴露給聯結器,這樣外部儲存系統便可以基於這個 API 實現行級更新和刪除。此外,此次釋出還擴充套件了 ALTER TABLE 語法,包括 ADD/MODIFY/DROP 列、主鍵和 Watermark 的能力。這些功能增強提升了使用者按需維護後設資料的靈活性。

Apache Flink 1.17 支援了 SQL Client 的 gateway 模式,允許使用者將 SQL 查詢提交給 SQL Gateway 來使用 Gateway 的各種功能。使用者可以使用 SQL 語句來管理作業的生命週期,包括顯示作業資訊和停止正在執行的作業,這為管理 Flink 作業提供了一個強大的工具。

Hive 相容


Apache Flink 1.17 對 Hive connector 進行了一系列改進,使其更加生產可用。在之前的版本中,對於 Hive 的寫入,只支援在流模式下自動地進行檔案合併,而不支援批模式。從 Flink 1.17 開始,在批模式下也能自動地進行檔案合併,這個特性可以大大減少小檔案的數量。同時,對於透過載入 HiveModule [8] 來使用 Hive 內建函式的場景,此次釋出引入了一些原生的 Hive 聚合函式如 SUM/COUNT/AVG/MIN/MAX 進 HiveModule 中,這些函式可以在基於雜湊的聚合運算元上執行,從而帶來顯著的效能提升。

流處理


Flink 1.17 解決了一些棘手的 Streaming SQL 語義和正確性問題,最佳化了 Checkpoint 效能,完善了 watermark 對齊機制,擴充套件了 Streaming FileSink,升級了 Calcite 和 FRocksDB 到更新的版本。這些提升進一步鞏固了 Flink 在流處理領域的領先地位。

Streaming SQL 語義完善


為了解決正確性問題並完善 Streaming SQL 語義,Flink 1.17 引入了一個實驗性功能叫 PLAN_ADVICE [9] ,該功能可以檢測使用者 SQL 潛在的正確性風險,並提供最佳化建議。例如,如果使用者透過 EXPLAIN PLAN_ADVICE 命令發現查詢存在 NDU(非確定性更新) [10] 問題,最佳化器會在物理計劃輸出的末尾追加建議,建議會標記到對應操作節點上,並提示使用者更新查詢和配置。透過提供這些具體的建議,最佳化器可以幫助使用者提高查詢結果的準確性。





== Optimized Physical Plan With Advice ==...advice[1]: [WARNING] The column(s): day(generated by non-deterministic function: CURRENT_TIMESTAMP ) can not satisfy the determinism requirement for correctly processing update message('UB'/'UA'/'D' in changelogMode, not 'I' only), this usually happens when input node has no upsertKey(upsertKeys=[{}]) or current node outputs non-deterministic update messages. Please consider removing these non-deterministic columns or making them deterministic by using deterministic functions.



PLAN_ADVICE 功能還可以幫助使用者提高查詢的效能和效率。例如,如果檢測到聚合操作可以最佳化為更高效的 local-global 聚合操作,最佳化器會提供相應的最佳化建議。透過應用這些具體的建議,最佳化器可以幫使用者提高其查詢的效能和效率。




== Optimized Physical Plan With Advice ==...advice[1]: [ADVICE] You might want to enable local-global two-phase optimization by configuring ('table.optimizer.agg-phase-strategy' to 'AUTO').

此外 Flink 1.17  還修復了多個可能影響資料正確性的 plan 最佳化問題,如:FLINK-29849 [11] , FLINK-30006 [12] , 和 FLINK-30841 [13] 等。


Watermark 對齊增強


在早期版本中, FLIP-182 [14] 提出了一種稱為 watermark 對齊的解決方案,以解決 event time 作業中的源資料傾斜問題。但是,該方案存在一個限制,即 Source 並行度必須和分割槽數匹配。這是因為具有多個分割槽的 Source 運算元中,如果一個分割槽比另一個分割槽更快地發出資料,此時需要快取大量資料。為了解決這個限制,Flink 1.17 引入了 FLIP-217 [15] ,它增強了 watermark 對齊考慮 watermark 邊界的情況下對 Source 運算元內的多個分割槽進行資料發射對齊。這個增強功能確保了 Source 中的 Watermark 前進更加協調,避免了下游運算元快取過多的資料,從而提高了流作業的執行效率。

Streaming FileSink 擴充套件


在新增 ABFS 支援之後,Streaming FileSink [16] 現在可以支援五種不同的檔案系統:HDFS、S3、OSS、ABFS 和 Local。這個擴充套件有效地覆蓋了主流檔案系統,為使用者提供了更多的選擇和更高的靈活性。

Checkpoint 改進


通用增量 Checkpoint(Generic Incremental Checkpont,簡稱 GIC)旨在提高 Checkpoint 過程的速度和穩定性。WordCount 案例中的一些實驗結果如下所示。請參考這篇 效能測評文章 [17] 獲取更多詳細資訊,該文結合理論分析和實踐結果展示了 GIC 的收益和成本。

表格-1: 在 WordCount 中開啟 GIC 後的收益


Checkpoint 

耗時

增量大小
資料回放量
cpu 使用量
網路流量
最大值
平均值
最大值
平均值

開啟 GIC vs

關閉 GIC

-79.5%

-95%
-86.7%
-39.3%
-46.8%

-53%

-67.7%

表格-2: 在 WordCount 中開啟 GIC 後的開銷


最大處理效能全量 Checkpoint 大小
開啟 GIC vs 關閉 GIC-2%+30%


Unaligned Checkpoint (UC) 可以大大提高反壓下 Checkpoint 的完成率。之前版本的 UC 會寫入過多的小檔案,進一步可能會導致 HDFS 的 namenode 負載過高。社群在 1.17 版本中解決了該問題,使 UC 在生產環境中更加可用。


Flink 1.17 版本提供了一個 REST API [18] ,使用者基於該 API 可以在作業執行時手動觸發具有自定義 Checkpoint 型別的 Checkpoint。例如,對於使用增量 Checkpoint 執行的作業,使用者可以定期或手動觸發全量 Checkpoint 來去除多個增量 Checkpoint 之間的關聯關係,從而避免引用很久以前的檔案。

RocksDBStateBackend 升級


Flink 1.17 版本將 FRocksDB [4] 的版本升級到 6.20.3-ververica-2.0,為 RocksDBStateBackend 帶來了一些改進:

1. 支援在 Apple 晶片上構建 FRocksDB Java

2. 透過避免昂貴的 ToString() 操作提高 Compaction Filter 的效能

3. 升級 FRocksDB 的 ZLIB 版本,避免 Memory Corruption

4. 為 RocksJava 新增 periodic_compaction_seconds 選項
可以參考 FLINK-30836 [19] 瞭解更多詳細資訊。

Flink 1.17 版本還提供了引數擴大 TaskManager 的 slot 之間共享記憶體的範圍,這種方式可以在 TaskManager 中 slot 記憶體使用不均勻時提高記憶體效率。基於此在調整引數後可以以資源隔離為代價來降低整體記憶體消耗。請參考 state.backend.rocksdb.memory.fixed-per-tm [20]瞭解更多相關資訊。

Calcite 升級


Flink 1.17 將 Calcite [21] 版本升級到 1.29.0 以提高 Flink SQL 系統的效能和效率。Flink 1.16 使用的是 Calcite 1.26.0 版本,該版本存在 SEARCH 運算子引發的 RexNode 簡化等嚴重問題,這些問題會導致查詢最佳化後產生錯誤的資料,如 CALCITE-4325 [22] CALCITE-4352 [23] 所報告的案例。透過升級到該版本的 Calcite,Flink 可以在 Flink SQL 中利用其功能改進和新特性。這不僅修復了多個 bug,同時加快了查詢處理速度。

其他


PyFlink


在 Flink 1.17 中,PyFlink 也完成了若干功能,PyFlink 是 Apache Flink 的 Python 語言介面。PyFlink 中,一些比較重要的改進包括支援 Python 3.10、支援在 Mac M1 和 M2 電腦上執行 PyFlink 等。此外,在該版本中還完成了一些小的功能最佳化,比如改進了 Java 和 Python 程式之間的跨程式通訊的穩定性、支援以字串的方式宣告 Python UDF 的結果型別、支援在 Python UDF 中訪問作業引數等。總體來說,該版本主要專注於改進 PyFlink 的易用性,而不是引入一些新的功能,期望透過這些易用性改進,改善使用者的使用體驗,使得使用者可以更高效地進行資料處理。

效能監控 Benchmark


這個版本週期中,我們也在 Slack 頻道( #flink-dev-benchmarks [24] )中加入了效能日常監控彙報來幫助開發者快速發現效能回退問題,這對程式碼質量保證非常有意義。透過 Slack 頻道或 Speed Center [25] 發現效能回退後,開發者可以按照 Benchmark's wiki [26] 中方式處理它。

Task 級別火焰圖


從 Flink 1.17 版本開始,Flame Graph 功能提供了針對 task 級別的視覺化支援,使得使用者可以更詳細地瞭解各個 task 的效能。該功能是相比於之前版本的 Flame Graph 的重大改進,因為它可以讓使用者選擇感興趣的 subtask 並檢視相應的火焰圖。透過這種方式,使用者可以確定任務可能出現效能問題的具體區域,然後採取措施加以解決。這可以顯著提高使用者資料處理管道的整體效率。

官宣|Apache Flink 1.17 釋出公告

通用的令牌機制


在 Flink 1.17 之前,Flink 只支援 Kerberos 認證和基於 Hadoop 的令牌。隨著 FLIP-272 [27] 的實現,Flink 的委託令牌框架更加通用,使其認證協議不再侷限於 Hadoop。這將允許貢獻者在未來可以新增對非 Hadoop 框架的支援,這些框架的認證協議可以不用基於 Kerberos。此外, FLIP-211 [28] 改進了 Flink 與 Kerberos 的互動,減少了在 Flink 中交換委託令牌所需的請求數量。

升級說明


Apache Flink 社群努力確保升級過程儘可能平穩, 但是升級到 1.17 版本可能需要使用者對現有應用程式做出一些調整。請參考 Release Notes [29] 獲取更多的升級時需要的改動與可能的問題列表細節。

貢獻者列表


Apache Flink 社群感謝對此版本做出貢獻的每一位貢獻者:

Ahmed Hamdy, Aitozi, Aleksandr Pilipenko, Alexander Fedulov, Alexander Preuß, Anton Kalashnikov, Arvid Heise, Bo Cui, Brayno, Carlos Castro, ChangZhuo Chen (陳昌倬), Chen Qin, Chesnay Schepler, Clemens, ConradJam, Danny Cranmer, Dawid Wysakowicz, Dian Fu, Dong Lin, Dongjoon Hyun, Elphas Toringepi, Eric Xiao, Fabian Paul, Ferenc Csaky, Gabor Somogyi, Gen Luo, Gunnar Morling, Gyula Fora, Hangxiang Yu, Hong Liang Teoh, HuangXingBo, Jacky Lau, Jane Chan, Jark Wu, Jiale, Jin, Jing Ge, Jinzhong Li, Joao Boto, John Roesler, Jun He, JunRuiLee, Junrui Lee, Juntao Hu, Krzysztof Chmielewski, Leonard Xu, Licho, Lijie Wang, Mark Canlas, Martijn Visser, MartijnVisser, Martin Liu, Marton Balassi, Mason Chen, Matt, Matthias Pohl, Maximilian Michels, Mingliang Liu, Mulavar, Nico Kruber, Noah, Paul Lin, Peter Huang, Piotr Nowojski, Qing Lim, QingWei, Qingsheng Ren, Rakesh, Ran Tao, Robert Metzger, Roc Marshal, Roman Khachatryan, Ron, Rui Fan, Ryan Skraba, Salva Alcántara, Samrat, Samrat Deb, Samrat002, Sebastian Mattheis, Sergey Nuyanzin, Seth Saperstein, Shengkai, Shuiqiang Chen, Smirnov Alexander, Sriram Ganesh, Steven van Rossum, Tartarus0zm, Timo Walther, Venkata krishnan Sowrirajan, Wei Zhong, Weihua Hu, Weijie Guo, Xianxun Ye, Xintong Song, Yash Mayya, YasuoStudyJava, Yu Chen, Yubin Li, Yufan Sheng, Yun Gao, Yun Tang, Yuxin Tan, Zakelly, Zhanghao Chen, Zhenqiu Huang, Zhu Zhu, ZmmBigdata, bzhaoopenstack, chengshuo.cs, chenxujun, chenyuzhi, chenyuzhi459, chenzihao, dependabot[bot], fanrui, fengli, frankeshi, fredia, godfreyhe, gongzhongqiang, harker2015, hehuiyuan, hiscat, huangxingbo, hunter-cloud09, ifndef-SleePy, jeremyber-aws, jiangjiguang, jingge, kevin.cyj, kristoffSC, kurt, laughingman7743, libowen, lincoln lee, lincoln.lil, liujiangang, liujingmao, liuyongvs, liuzhuang2017, luoyuxia, mas-chen, moqimoqidea, muggleChen, noelo, ouyangwulin, ramkrish86, saikikun, sammieliu, shihong90, shuiqiangchen, snuyanzin, sunxia, sxnan, tison, todd5167, tonyzhu918, wangfeifan, wenbingshen, xuyang, yiksanchan, yunfengzhou-hub, yunhong, yuxia Luo, yuzelin, zhangjingcun, zhangmang, zhengyunhong.zyh, zhouli, zoucao, 沈嘉琦

參考連結

[1] 流式數倉:

https://developer.aliyun.com/article/851771?spm=a2c6h.12873639.article-detail.6.4ff859e2A1PFCU

[2] FLIP-282:

[3] FLIP-217:
%3A+Support+watermark+alignment+of+source+splits
[4] FRocksDB:
[5] 新版 Sink:

[6] OutputFormat Sink

/flink-core/src/main/java/org/apache/flink/api/common/io/OutputFormat.java

[7] 混合 Shuffle:

[8] HiveModule:

[9] PLAN_ADVICE:

https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/dev/table/sql/explain/#explaindetails

[10] NDU(非確定性更新):

https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/dev/table/concepts/determinism/#3-%E6%B5%81%E4%B8%8A%E7%9A%84%E7%A1%AE%E5%AE%9A%E6%80%A7

[11] FLINK-29849:

[12] FLINK-30006:

[13] FLINK-30841:

[14] FLIP-182:

%3A+Support+watermark+alignment+of+FLIP-27+Sources

[15] FLIP-217:

%3A+Support+watermark+alignment+of+source+splits

[16] FileSink:

[17] 效能測評文章:

https://mp.weixin.qq.com/s/8662I8knfYTUMQ-3plqUKQ

[18] REST API:

[19] FLINK-30836:

[20] state.backend.rocksdb.memory.fixed-per-tm:

[21] Calcite:

[22] CALCITE-4325:

[23] CALCITE-4352:

[24] #flink-dev-benchmarks:

[25] Speed Center:

[26] Benchmark's wiki:

[27] FLIP-272:

%3A+Generalized+delegation+token+support

[28] FLIP-211:

%3A+Kerberos+delegation+token+framework

[29] Release Notes:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2941445/,如需轉載,請註明出處,否則將追究法律責任。

相關文章