我一直在研究 Flink 1.14中有界資料的不同全域資料排序選項。我發現在 Stackoverflow 和其他網站上關于這個的許多問題已經有好幾年的歷史了,關于不推薦使用的 API 或者沒有完全回答這個問題。由于 Flink 正在快速發展,我想問一下最新穩定的 Flink(1.14)中可用的選項。
以下是我對當前情況的理解(可能是錯誤的)。我的問題也附上。Flink 有兩個 API -DataStream和Table- 可以在batch或streaming執行模式下運行。該DataSetAPI 已棄用。
批量執行
Table API:它有一個排序運算子。我用它來對有界資料進行排序。但似乎它的并行度不能超過 1。我嘗試使用該
table.exec.resource.default-parallelism屬性,這增加了像groupby這樣的運算子的并行度。但它并沒有增加orderby的并行度。問題- 如果我想在批處理模式下對有界資料進行全域排序,orderby 的并行度是否限制為 1?那么 flink 是如何處理大資料的呢?它會溢位到磁盤嗎?DataStream API - 我沒有找到任何明確的 API 來進行排序。我能想到的唯一方法是首先按范圍磁區并使用自定義reduce函式在本地對每個磁區進行排序。reduce 函式將輸出已排序的磁區。但是為了獲得全域排序的結果,我們再次必須將結果傳遞給并行度為 1 的運算子。這再次帶來了上面提到的資料大小問題。
流式執行
Table API:如果使用流模式,order-by 運算子需要時間作為屬性。我無法使用它對有界資料進行排序。
DataStream API : 選項與批量執行模式下的DataStream API相同。
總的來說,我無法在 Flink 中找到一個真正的并行實作來對有界資料集進行排序。我的上述發現是否正確?
uj5u.com熱心網友回復:
鑒于 Flink 的組織方式,對于批處理,我認為最好的方法是對資料的磁區進行排序,然后合并這些排序的磁區。最后一步不能并行完成。我不知道 Table/SQL API 是否會自動執行類似的操作,但我懷疑它可能會在快速查看源代碼后進行。
你可以在 flink 用戶郵件串列( https://flink.apache.org/community.html#how-to-subscribe-to-a-mailing-list)上詢問這個問題。
要更深入地了解 SQL 規劃器如何執行批處理作業負載以及如何調整它們,我推薦https://flink.apache.org/2021/10/26/sort-shuffle-part1.html。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/466851.html
標籤:排序 apache-flink
上一篇:無法使用exec運行終端命令
