Apache Flink 中的全局排序
Global sorting in Apache Flink
数据集的sortPartition方法根据一些指定的字段在本地对数据集进行排序。如何在 Flink 中以高效的方式对大型数据集进行全局排序?
目前这不太容易实现,因为 Flink 还没有提供内置的范围分区策略。
解决方法是实施自定义 Partitioner
:
DataSet<Tuple2<Long, Long>> data = ...
data
.partitionCustom(new Partitioner<Long>() {
int partition(Long key, int numPartitions) {
// your implementation
}
}, 0)
.sortPartition(0, Order.ASCENDING)
.writeAsText("/my/output");
注意:为了使用自定义分区器实现均衡分区,您需要了解key的取值范围和分布。
目前 work in progress 支持 Apache Flink 中的范围分区器(自动采样),应该很快就会可用。
编辑(2016 年 6 月 7 日):范围分区已添加到 Apache Flink 版本 1.0.0。您可以按如下方式对数据集进行全局排序:
DataSet<Tuple2<Long, Long>> data = ...
data
.partitionByRange(0)
.sortPartition(0, Order.ASCENDING)
.writeAsText("/my/output");
请注意,范围分区对输入数据集进行采样以计算大小相等的分区的数据分布。
数据集的sortPartition方法根据一些指定的字段在本地对数据集进行排序。如何在 Flink 中以高效的方式对大型数据集进行全局排序?
目前这不太容易实现,因为 Flink 还没有提供内置的范围分区策略。
解决方法是实施自定义 Partitioner
:
DataSet<Tuple2<Long, Long>> data = ...
data
.partitionCustom(new Partitioner<Long>() {
int partition(Long key, int numPartitions) {
// your implementation
}
}, 0)
.sortPartition(0, Order.ASCENDING)
.writeAsText("/my/output");
注意:为了使用自定义分区器实现均衡分区,您需要了解key的取值范围和分布。
目前 work in progress 支持 Apache Flink 中的范围分区器(自动采样),应该很快就会可用。
编辑(2016 年 6 月 7 日):范围分区已添加到 Apache Flink 版本 1.0.0。您可以按如下方式对数据集进行全局排序:
DataSet<Tuple2<Long, Long>> data = ...
data
.partitionByRange(0)
.sortPartition(0, Order.ASCENDING)
.writeAsText("/my/output");
请注意,范围分区对输入数据集进行采样以计算大小相等的分区的数据分布。