天天看點

官宣|Apache Flink 1.15 釋出公告

作者 | Joe Moser & 高赟

翻譯 | 高赟

Apache Flink,作為 Apache 社群最活躍的項目之一<sup>[1]</sup>,一直秉承積極開放的态度不斷進行技術深耕。在此我們很榮幸的釋出 Flink 1.15 版本,并和大家分享這個版本令人振奮的一些功能和改進!

Apache Flink 核心概念之一是流 (無界資料) 批 (有界資料) 一體。流批一體極大的降低了流批融合作業的開發複雜度。在過去的幾個版本中,Flink 流批一體逐漸成熟,Flink 1.15 版本中流批一體更加完善,後面我們也将繼續推動這一方向的進展。目前大資料處理的一個趨勢是越來越多的業務和場景采用低代碼的方式進行資料分析,而 Flink SQL則是這種低代碼方式資料分析的典型代表。越來越多的使用者開始采用 Flink SQL 來實作他們的業務,這也是 Flink 使用者和生态快速增長的重要原因之一。Apache Flink 作為資料處理生态中的重要一環,可以與許多其他技術結合在一起支援各類使用者場景。在當下雲原生的背景下。我們也盡可能将 Flink 與這些系統以及各類雲基礎設施進行無縫內建。

在 1.15 版本中,Apache Flink 社群在上述這些方面都取得了重大進展:

  • 1.15 版本的一大看點是改進了運維 Apache Flink 的體驗:包括明确 Checkpoint 和 Savepoint 在不同作業之間的所屬權,簡化 Checkpoint 和 Savepoint 生命周期管理;更加無縫支援完整的自動伸縮;通過 Watermark 對齊來消除多個資料源速率不同帶來的問題等
  • 1.15 版本中,Flink 進一步完善流批一體的體驗:繼續完善部分作業完成後的 Checkpoint 操作;支援批模式下的 Window table-valued 函數,并且使其在流批混合的場景下更加易用。
  • Flink SQL 的進階:包括能夠在不丢失狀态的情況下更新 SQL 作業;添加了對 JSON 相關函數的支援來簡化資料的輸入與輸出操作。
  • Flink 作為整個資料處理生态中的一環,1.15 版本進一步提升了與雲服務的互動操作性,并且添加了更多的 Sink 連接配接器與資料格式。最後,我們在運作時中去除了對 Scala 的依賴<sup>[2]</sup>。

輕松運維 Apache Flink

長期來看,即使是由最好的工程團隊來進行建構和調優,Flink 作業仍然依賴運維操作。 Flink 支援多種不同的部署模式、API、調優配置與用例,這意味着運維工作至關重要并且可能十分繁重。

在這個版本中,我們聽取了使用者的回報,對 Flink 的運維操作進行了簡化,使使用者能夠更加輕松的進行運維。現在 Flink 明确了 Checkpoint 與 Savepoint 在不同作業之間的所屬權;更加無縫支援完整的自動伸縮;通過 Watermark 對齊消除多個資料源産出速率不同帶來的問題,并且初步支援了在不丢失狀态的情況下更新 SQL 作業的能力。

澄清 Checkpoint 與 Savepoint 語義

Flink 容錯政策的兩個重要基礎概念是 Checkpoint<sup>[3]</sup> 與 Savepoint<sup>[4]</sup> (參見比較<sup>[5]</sup>)。

Savepoint 的主要作用是支援作業修改、備份與更新等場景,它是由使用者來完全控制的。而另一方面,Checkpoint 由 Flink 完全控制,用于通過支援快速恢複與重新開機來實作容錯的能力。這兩個概念十分相似,并且它們共享了很大一部分實作。

然而,由于遵循不同的功能要求,這兩個概念逐漸變得不一緻,使使用者看起來沒有完整的頂層設計。根據使用者回報,這兩個概念應該被更好地對齊和協調,最重要的是,這兩個概念應該被更清晰的定義。

在某些停止或重新啟動作業的場景下,雖然邏輯上應該使用 Savepoint,但使用者還是會選擇使用持久化的 Checkpoint,因為 Savepoint 無法享受 Checkpoint 可以使用的一些優化而導緻執行較為緩慢。但是在這種情況下,作業從持久化的 Checkpoint 重新開機時 (這種情況下 Checkpoint 實際上被當作 Savepoint 來使用),對使用者來說何時可以清理 Checkpoint 中的資料并不十厘清楚。

是以,在 FLIP-193: 狀态所屬權<sup>[6]</sup> 中,Flink 希望可以将 Savepoint 和 Checkpoint 抽像成唯一差別是所屬權不同的兩個概念。在 1.15 中,通過支援原生的增量 Savepoint<sup>[7]</sup>,Flink 解決了 Savepoint 的一些不足:在過去的版本中,Savepoint 總是使用标準格式以及非增量的方式,這也是導緻它性能較差的原因。在 1.15 中,如果使用者選擇使用原生格式并且同時使用了 RocksDB 狀态存儲,那麼Savepoint 将采用增量的方式來執行。我們也更新了相關文檔來更好的概覽與了解 Checkpoint 與 Savepoint 的差異。此外,關于從 Savepoint / 持久化的 Checkpoint 恢複<sup>[8]</sup>的語義,我們顯式的引入了 CLAIM 與 NO_CLAIM 兩種模式。對于 CLAIM 模式 Flink 将接管快照中資料的所屬權,而對于 NO_CLAIM 模式,Flink 将建立它自己的副本,而由使用者來負責管理與删除原始的資料。注意現在預設将采用 NO_CLAIM 模式,之前版本中從 Savepoint / 持久化的 Checkpoint 恢複的行為可以通過指定 LEGACY 模式來恢複。

基于 Reactive 模式與自适應排程器的彈性伸縮

由于越來越多的雲服務基于 Apache Flink 建構 ,Flink 項目變得越來越雲原生,這使得彈性伸縮也越來越重要。

此版本改進了 Reactive 模式<sup>[9]</sup> 的名額。Reactive 模式是一個作業級别的模式,在這種模式下, JobManager 将嘗試使用所有可用的 TaskManager 上的資源。我們在 1.15 中保證了作業級别的名額在 Reactive 模式下也可以正常的工作。

我們還為自适應排程器<sup>[10]</sup> 添加了異常曆史記錄。自适應排程器是一個新的排程器,它首先聲明了所需的資源并且根據根據資源情況在執行前決定資源的并行度。

此外,Flink 提高了縮減作業規模的速度:TaskManager 現在有一個專用代碼路徑來關閉自己,它會主動從叢集中登出自己而不是依賴于心跳,進而給 JobManager 一個明确的縮減作業規模的信号。

自适應批排程器

在 1.15 中,我們為 Apache Flink 引入了一個新的自适應批處理排程器<sup>[11]</sup>。這一排程器可以自動根據每個節點需要處理的資料量的大小自動決定批處理作業中各節點的并行度。

此排程器的主要優點包括:

  1. 易用性:批處理作業的使用者不再需要手動調優并行度。
  2. 自适應:自動調整并行度可以更好地适應節點消費資料集随時間發生變化的情況。
  3. 細粒度:每個作業節點的并行度可以單獨調整。這允許 SQL 批處理作業的節點自動為每個節點選擇單獨選擇最适合的并行度。

跨源節點的 Watermark 對齊

如果一個作業中使用了多個資料源節點,并且這些資料源以不同的節奏來增長 Watermark,這可能在下遊節點中産生一些問題。例如,一些算子可能需要緩存非常大量的資料,進而導緻巨大的算子狀态。是以,我們在這一版本中引入了 Watermark 對齊的能力。

基于新的 Source 接口來實作的資料源節點可以啟用 Watermark 對齊功能<sup>[12]</sup>。使用者可以定義對齊組,如果其中某個源節點與其它節點相比Watermark領先過多,使用者可以暫停從該節點中消費資料。對齊 Watermark 的理想情況是有兩個或更多以不同速度産生 Watermark 的資料源節點,并且資料源節點并發與外部系統的分片數量相同的情況。

SQL 版本更新

SQL 查詢的執行計劃及其生成的拓撲是通過優化規則和一個基于成本的模型來得到的,這意味着即使最小的更改也可能會産生一個完全不同的拓撲。這種動态性使得在不同 Flink 版本間保證快照相容性非常具有挑戰性。在 1.15 中,社群首先通過保持拓撲不變的方式使相同的查詢在更新 Flink 版本後仍然可以啟動和執行。

SQL 更新的核心是 JSON 計劃 (即以 JSON 表達的查詢執行計劃,我們目前隻有 JavaDocs 中的文檔,并且仍在努力更新文檔<sup>[13]</sup> ),JSON Plan 可以讓 SQL 計劃以結構化資料的方式被導入和導出,之前這一功能是一個内部實作,現在它将被公開以提供給使用者使用。Table API 與 SQL 都會提供一種方式來編譯和執行一個保證在不同版本中保持不變的執行計劃。 此功能将作為實驗性 MVP 功能釋出。想要嘗試的使用者已經可以建立一個 JSON 計劃,然後可以使用這一計劃在更新後基于舊的算子結構恢複 Flink 作業。我們将在 1.16 中提供這一功能的完整支援。

從長遠來看,可靠的更新使 Flink SQL 可以線上上生産場景更加可靠的使用。

基于 Changelog 的狀态存儲

在 Flink 1.15 中,我們引入了 MVP 特性:基于 Changelog 的狀态存儲<sup>[14]</sup>。這一新的狀态存儲旨在支援更短、更可以預測的 Checkpoint 間隔。它具有以下優勢:

  1. 更短的端到端延遲:端到端延遲主要取決于 Checkpoint 機制,特别是使用了兩階段送出的支援端到端一緻性的 Sink 節點的情況,這種情況下縮短 Checkpoint 周期意味着可以更快的送出資料。
  2. 更可預測的 Checkpoint 間隔:目前 Checkpoint 的完成時間很大程度上取決于需要儲存在 Checkpoint 中的資料的大小。通過使這一資料總是可以很小,Checkpoint 的完成時間變得更加可以預測。
  3. 恢複工作更少:Checkpoint 越頻繁,每次重新開機後重新處理的資料也會越少。

基于 Changelog 的狀态存儲通過在背景不斷向非易失性存儲上上傳狀态變化的記錄來實作上述目标。

可重複的清理

在以前的 Flink 版本中,Flink 在作業結束時隻嘗試清理一次與作業相關的殘留資料,這可能會導緻在發生錯誤時無法完成清理。在這個版本中,Flink 将嘗試重複運作清理以避免殘留資料。預設情況下,Flink 将不斷重試機制,直到運作成功為止。使用者可以通過配置相關參數<sup>[15]</sup>來改變這種行為。禁用重試政策可以恢複 Flink 之前版本的行為。

清理 Checkpoint 的相關工作仍在進行中,包括 FLINK-26606<sup>[16]</sup>。

Open API

Flink 現在提供遵循 Open API<sup>[17]</sup> 标準的 REST API 規範。這允許 REST API 與遵循 Open API 标準的工具直接互動。您可以在 18 找到相應規範。

Application 模式的改進

在 Application 模式<sup>[19]</sup> 下運作 Flink 時,如果使用者進行了相關配置<sup>[20]</sup>,它現在可以保證作業在結束前能夠正常完成 stop-with-savepoint 操作。

在 Application 模式下運作的作業的恢複和清理也得到了改進。本地狀态的中繼資料也可以儲存在工作目錄中,這使得從本地狀态恢複更容易 (例如将工作目錄設定在非易失的跨機器的存儲中的情況,之前本地狀态的中繼資料儲存在記憶體中,是以在作業恢複時無法找回)。

流批一體的更多進展

在最新版本中,我們對流批一體的支援進行了進一步的完善。

作業結束前的 Checkpoint

在 Flink 1.14 中,添加了對作業結束前等待一次 Checkpoint 操作的支援,進而保證使用流模式處理有限資料可以保證所有被據被送出,但是在 1.14 中,該功能必須被手動啟用。自上次釋出以來,我們聽取了使用者回報并決定預設啟用它。關于這一功能的更多資訊以及如何禁用此功能,請參閱 21。需要指出的是,這一預設配置的變化可能延長使用流模式處理有界資料時的執行時間,因為作業必須在結束前等待下一個 Checkpoint 完成。

Window table-valued 函數

Window table-valued 函數<sup>[22]</sup> 之前僅可用于流模式下。在 1.15 中,它們現在也可以在批模式下使用。此外,通過實作一個專門的算子,我們現在不再要求這些 Window 函數必須定義一個聚合器,進而進一步增強了 Window table-valued 函數。

Flink SQL

社群名額表明 Flink SQL 被廣泛使用并且變得越來越流行。在 1.15 中社群對 Flink SQL 也做了許多改進,下文将更加詳細地讨論其中兩個改進。

CAST / 類型系統增強

資料以各種形式出現,但是并不是所有情況下都是使用者需要的類型,是以 CAST<sup>[23]</sup> 是 SQL 中最常見的操作之一。在 Flink 1.15 中,失敗的 CAST 的預設行為已從傳回 null 更改為傳回錯誤,進而使它更符合 SQL 标準。之前的行為可以通過調用新引入的 TRY_CAST 函數或通過在恢複時配置相應參數來實作。

此外,Flink 1.15 也修正了許多 CAST 的錯誤并對它的功能進行了改進,進而保證結果的正确性。

JSON 函數

JSON 是最流行的資料格式之一,越來越多的 SQL 使用者需要生成或讀取 JSON 類型的資料。Flink 1.15 根據 SQL 2016 标準引入了多個 JSON 處理函數<sup>[24]</sup>。這些函數允許使用者來使用 Flink SQL 方言檢查、建立和修改 JSON 字元串。

社群支援

Flink 的一個重要目标是使使用者能夠建構流資料管道來解決他們的用例。一般來說,Apache Flink 不會單獨使用,而是作為更大的資料分析平台中的重要一環。是以,簡化 Flink 在雲環境下的使用與維護、支援無縫連接配接到其他系統并繼續支援 Java 和 Python 等程式設計語言對完善 Flink 生态十分重要。

雲環境互操作性

許多使用者在不同雲服務提供商所提供的雲基礎設施中部署與使用 Flink,同時也有一些服務可以幫助使用者管理部署在他們的平台上的 Flink 叢集。

在 Flink 1.15 中,我們新增了寫入 Google Cloud Storage 的支援。我們還整理了 Flink 生态中的連接配接器并把精力放在支援 AWS 相關的生态上 (即 KDS<sup>[25]</sup> 與 Firehose<sup>[26]</sup> )。

Elasticsearch Sink

我們在 Flink 的整個連接配接器生态上進行了大量工作,但我們想強調 Elasticsearch Sink<sup>[27]</sup>:它是基于最新的 Sink API 來實作的,是以可以提供異步輸出與端到端一緻性的能力。它可以作為未來更多 Sink 實作的模闆。

Scala-free 的 Flink

博文<sup>[28]</sup> 已經解釋了為什麼 Scala 使用者現在可以結合任何 Scala 版本 (包括 Scala 3) 使用 Flink的 Java API。

最後,删除 Scala 依賴隻是清理和更新來自 Flink 生态系統的各種技術的更大工作的一部分。

從 Flink 1.14 開始,我們移除了 Mesos 內建,隔離了 Akka,廢棄了 DataSet Java API,并将 Table API 隐藏在一個抽象後面。社群的這些努力也吸引了許多使用者與貢獻者的關注。

PyFlink

在 Flink 1.15 之前,Python API 中使用者定義的函數是在單獨的 Python 程序中執行的,這将導緻額外的序列化/反序列化和程序通信開銷。在資料較大的場景中,例如圖像處理等,這個開銷變得不可忽視。此外,由于它涉及程序間通信,這一處理延遲也是不可忽略的。這些問題在延遲至關重要的場景是不可接受的,例如量化交易等。是以,在 Flink 1.15 中,我們引入了一種 “線程” 模式的新執行模式:使用者自定義的函數将在 JVM 中作為線程執行,而不是在單獨的 Python 程序中執行。基準測試表明在 JSON 處理等常見場景中吞吐量可以增加 2 倍,處理延遲也從幾秒到微秒。需要指出的是,由于這仍然是 “線程” 模式的第一個版本,此前它僅支援 Python Table API 與 SQL 中的标量函數。我們計劃在下一版本中将其擴充到 Python API 中其他類型的自定義函數。

其它

Flink 1.15 進一步完善了對于連接配接器測試架構<sup>[29]</sup> 的支援,如果你想貢獻一個連接配接器或改進一個連接配接器,你絕對應該看一下這部分工作。

Flink 1.15 也添加了一些期待已久的功能,包括 CSV 格式<sup>[30]</sup> 與小檔案壓縮<sup>[31]</sup>。

同時,Sink API 被更新到版本 2<sup>[32]</sup>。我們鼓勵每個連接配接器的維護者更新到這個版本。

總結

Apache Flink 簡化了運維操作,在對齊流批處理功能取得進一步進展,改進了 SQL 元件使其變得更易于使用,并且現在可以更好地與其他系統進行內建。

同值得一提的是社群為 CDC 連接配接器<sup>[33]</sup> 建立了一個新家。同時,連接配接器相關代碼<sup>[34]</sup> 将被移動到 Flink 外一個單獨的倉庫中 (以 Elasticsearch Sink 作業第一個例子<sup>[35]</sup> )。此外,現在社群新增了一個由社群維護的關于 K8s Operator<sup>[36]</sup> 的公告部落格<sup>[37]</sup>。

展望未來,社群将繼續專注于使 Apache Flink 成為真正的流批一體處理系統,并緻力于将 Flink 更好地內建到雲原生生态系統中。

更新說明

雖然我們的目标是盡可能支援平穩更新,但是一些改動仍然需要使用者在更新到 1.15 的時候對它們的程式進行調整。請參考 Release Notes<sup>[38]</sup> 來獲得在更新時需要進行的改動與可能的問題清單。其中最值得一提的是由于去除 Scala 依賴的努力,現在許多依賴項中不再需要添加 Scala 版本字尾。關于更多資訊可以參考<sup>[39]</sup>。

原文連結:

https://flink.apache.org/news/2022/05/05/1.15-announcement.html

貢獻者清單

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

Ada Wong, Ahmed Hamdy, Aitozi, Alexander Fedulov, Alexander Preuß, Alexander Trushev, Ali Bahadir Zeybek, Anton Kalashnikov, Arvid Heise, Bernard Joseph Jean Bruno, Bo Cui, Brian Zhou, Camile, ChangLi, Chengkai Yang, Chesnay Schepler, Daisy T, Danny Cranmer, David Anderson, David Moravek, David N Perkins, Dawid Wysakowicz, Denis-Cosmin Nutiu, Dian Fu, Dong Lin, Eelis Kostiainen, Etienne Chauchot, Fabian Paul, Francesco Guardiani, Gabor Somogyi, Galen Warren, Gao Yun, Gen Luo, GitHub, Gyula Fora, Hang Ruan, Hangxiang Yu, Honnix, Horace Lee, Ingo Bürk, JIN FENG, Jack, Jane Chan, Jark Wu, JianZhangYang, Jiangjie (Becket) Qin, JianzhangYang, Jiayi Liao, Jing, Jing Ge, Jing Zhang, Jingsong Lee, JingsongLi, Jinzhong Li, Joao Boto, Joey Lee, John Karp, Jon Gillham, Jun Qin, Junfan Zhang, Juntao Hu, Kexin, Kexin Hui, Kirill Listopad, Konstantin Knauf, LB-Yu, Leonard Xu, Lijie Wang, Liu Jiangang, Maciej Bryński, Marios Trivyzas, MartijnVisser, Mason Chen, Matthias Pohl, Michal Ciesielczyk, Mika, Mika Naylor, Mrart, Mulavar, Nick Burkard, Nico Kruber, Nicolas Raga, Nicolaus Weidner, Niklas Semmler, Nikolay, Nuno Afonso, Oleg Smirnov, Paul Lin, Paul Zhang, PengFei Li, Piotr Nowojski, Px, Qingsheng Ren, Robert Metzger, Roc Marshal, Roman, Roman Khachatryan, Ruanshubin, Rudi Kershaw, Rui Li, Ryan Scudellari, Ryan Skraba, Sebastian Mattheis, Sergey, Sergey Nuyanzin, Shen Zhu, Shengkai, Shuo Cheng, Sike Bai, SteNicholas, Steffen Hausmann, Stephan Ewen, Tartarus0zm, Thesharing, Thomas Weise, Till Rohrmann, Timo Walther, Tony Wei, Victor Xu, Wenhao Ji, X-czh, Xianxun Ye, Xin Yu, Xinbin Huang, Xintong Song, Xuannan, Yang Wang, Yangze Guo, Yao Zhang, Yi Tang, Yibo Wen, Yuan Mei, Yuanhao Tian, Yubin Li, Yuepeng Pan, Yufan Sheng, Yufei Zhang, Yuhao Bi, Yun Gao, Yun Tang, Yuval Itzchakov, Yuxin Tan, Zakelly, Zhu Zhu, Zichen Liu, Zongwen Li, atptour2017, baisike, bgeng777, camilesing, chenxyz707, chenzihao, chuixue, dengziming, dijkwxyz, fanrui, fengli, fenyi, fornaix, gaurav726, godfrey he, godfreyhe, gongzhongqiang, haochenhao, hapihu, hehuiyuan, hongshuboy, huangxingbo, huweihua, iyupeng, jiaoqingbo, jinfeng, jxjgsylsg, kevin.cyj, kylewang, lbb, liliwei, liming.1018, lincoln lee, liufangqi, liujiangang, liushouwei, liuyongvs, lixiaobao14, lmagic233, lovewin99, lujiefsi, luoyuxia, lz, mans2singh, martijnvisser, mayue.fight, nanmu42, oogetyboogety, paul8263, pusheng.li01, qianchutao, realdengziqi, ruanhang1993, sammieliu, shammon, shihong90, shitou, shouweikun, shouzuo1, shuo.cs, siavash119, simenliuxing, sjwiesman, slankka, slinkydeveloper, snailHumming, snuyanzin, sujun, sujun1, syhily, tsreaper, txdong-sz, unknown, vahmed-hamdy, wangfeifan, wangpengcheng, wangyang0918, wangzhiwu, wangzhuo, wgzhao, wsz94, xiangqiao123, xmarker, xuyang, xuyu, xuzifu666, yangjunhan, yangze.gyz, ysymi, yuxia Luo, zhang chaoming, zhangchaoming, zhangjiaogg, zhangjingcun, zhangjun02, zhangmang, zlzhang0122, zoucao, zp, zzccctv, 周平, 子揚, 李銳, 蔣龍, 龍三, 莊天翼

參考連結

[1] https://www.apache.org/foundation/docs/FY2021AnnualReport.pdf

[2] https://flink.apache.org/2022/02/22/scala-free.html

[3] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/checkpoints/

[4] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/savepoints/

[5] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/checkpoints_vs_savepoints/

[6] https://cwiki.apache.org/confluence/display/FLINK/FLIP-193%3A+Snapshots+ownership

[7] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/savepoints/#savepoint-format

[8] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/savepoints/#resuming-from-savepoints

[9] https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/elastic_scaling/#reactive-mode

[10] https://cwiki.apache.org/confluence/display/FLINK/FLIP-160%3A+Adaptive+Scheduler

[11] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/deployment/elastic_scaling/#adaptive-batch-scheduler

[12] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/datastream/event-time/generating_watermarks/#watermark-alignment-beta

[13] https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/table/api/CompiledPlan.html

[14] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/ops/state/state_backends/#enabling-changelog

[15] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/deployment/config/#retryable-cleanup

[16] https://issues.apache.org/jira/browse/FLINK-26606

[17] https://www.openapis.org

[18] https://nightlies.apache.org/flink/flink-docs-master/docs/ops/rest_api/#jobmanager

[19] https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/overview/

[20] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/deployment/config/#execution-shutdown-on-application-finish

[21] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/datastream/fault-tolerance/checkpointing/#checkpointing-with-parts-of-the-graph-finished

[22] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/table/sql/queries/window-tvf/

[23] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/table/types/#casting

[24] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/table/functions/systemfunctions/#json-functions

[25] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/kinesis/

[26] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/firehose/

[27] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/elasticsearch/

[28] https://flink.apache.org/2022/02/22/scala-free.html

[29] https://github.com/PatrickRen/flink/tree/master/flink-test-utils-parent/flink-connector-testing

[30] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/formats/csv/

[31] https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/filesystem/#compaction

[32] https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/connector/sink2/StatefulSink.java

[33] https://ververica.github.io/flink-cdc-connectors/release-2.1/index.html

[34] https://cwiki.apache.org/confluence/display/FLINK/Connectors

[35] https://github.com/apache/flink-connector-elasticsearch/

[36] https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main/

[37] https://flink.apache.org/news/2022/04/03/release-kubernetes-operator-0.1.0.html

[38] https://nightlies.apache.org/flink/flink-docs-release-1.15/release-notes/flink-1.15/