使用 Table 和 Datastream API 在 Flink 1.14 中进行全局排序
Global sort in Flink 1.14 with Table and Datastream APIs
我一直在寻找 Flink 1.14 中 bounded 数据的不同全局数据排序选项。我发现 Whosebug 和其他网站上关于此的许多问题已经有好几年了,关于已弃用的 APIs 或者没有完全回答这个问题。由于Flink发展迅速,想问一下最新稳定的Flink(1.14)中可用的选项
以下是我对当前情况的理解(可能有误)。我的问题也附上。 Flink 有两个 APIs - DataStream
和 Table
- 在 batch
或 streaming
执行模式下可能 运行。 DataSet
API 已弃用。
批量执行
Table API: 它有一个 order-by operator. I have used that to sort bounded data. But it seems like its parallelism cannot go above 1. I tried using the table.exec.resource.default-parallelism
property, which increases the parallelism for operator like groupby。但它并没有增加 orderby
的并行度。 问题 - 如果我想在批处理模式下对有界数据进行全局排序,orderby 的并行度是否限制为 1?那么flink是如何处理大数据的呢?它会溢出到磁盘吗?
DataStream API - 我没有找到任何明确的 API 进行排序。我能想到的唯一方法是首先按范围分区,然后使用自定义 reduce 函数在本地对每个分区进行排序。 reduce 函数将输出排序的分区。但是为了得到一个全局排序的结果,我们又要将结果传递给一个并行度为1的算子。这又会带来上面提到的数据大小问题。
流式执行
Table API:如果使用streaming模式,order-by算子需要时间作为属性。我无法使用它来对有界数据进行排序。
DataStream API:选项同DataStream API批处理模式。
总的来说,我无法在 Flink 中找到一个真正并行的排序有界数据集的实现。我的上述发现是否正确?
考虑到 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。
我一直在寻找 Flink 1.14 中 bounded 数据的不同全局数据排序选项。我发现 Whosebug 和其他网站上关于此的许多问题已经有好几年了,关于已弃用的 APIs 或者没有完全回答这个问题。由于Flink发展迅速,想问一下最新稳定的Flink(1.14)中可用的选项
以下是我对当前情况的理解(可能有误)。我的问题也附上。 Flink 有两个 APIs - DataStream
和 Table
- 在 batch
或 streaming
执行模式下可能 运行。 DataSet
API 已弃用。
批量执行
Table API: 它有一个 order-by operator. I have used that to sort bounded data. But it seems like its parallelism cannot go above 1. I tried using the
table.exec.resource.default-parallelism
property, which increases the parallelism for operator like groupby。但它并没有增加orderby
的并行度。 问题 - 如果我想在批处理模式下对有界数据进行全局排序,orderby 的并行度是否限制为 1?那么flink是如何处理大数据的呢?它会溢出到磁盘吗?DataStream API - 我没有找到任何明确的 API 进行排序。我能想到的唯一方法是首先按范围分区,然后使用自定义 reduce 函数在本地对每个分区进行排序。 reduce 函数将输出排序的分区。但是为了得到一个全局排序的结果,我们又要将结果传递给一个并行度为1的算子。这又会带来上面提到的数据大小问题。
流式执行
Table API:如果使用streaming模式,order-by算子需要时间作为属性。我无法使用它来对有界数据进行排序。
DataStream API:选项同DataStream API批处理模式。
总的来说,我无法在 Flink 中找到一个真正并行的排序有界数据集的实现。我的上述发现是否正确?
考虑到 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。